File otp_src_19.0.5-lib-gs.patch of Package erlang

diff -Ndurp otp_src_19.0.5/lib/gs/src/gse.erl otp_src_19.0.5-lib-gs/lib/gs/src/gse.erl
--- otp_src_19.0.5/lib/gs/src/gse.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gse.erl	2016-08-25 16:37:44.560693435 +0300
@@ -24,72 +24,72 @@
 %%%----------------------------------------------------------------------
 
 -module(gse).
--compile([{nowarn_deprecated_function,{gs,arc,2}},
-          {nowarn_deprecated_function,{gs,arc,3}},
-          {nowarn_deprecated_function,{gs,button,2}},
-          {nowarn_deprecated_function,{gs,button,3}},
-          {nowarn_deprecated_function,{gs,canvas,2}},
-          {nowarn_deprecated_function,{gs,canvas,3}},
-          {nowarn_deprecated_function,{gs,checkbutton,2}},
-          {nowarn_deprecated_function,{gs,checkbutton,3}},
-          {nowarn_deprecated_function,{gs,config,2}},
-          {nowarn_deprecated_function,{gs,create,3}},
-          {nowarn_deprecated_function,{gs,create,4}},
-          {nowarn_deprecated_function,{gs,create_tree,2}},
-          {nowarn_deprecated_function,{gs,destroy,1}},
-          {nowarn_deprecated_function,{gs,editor,2}},
-          {nowarn_deprecated_function,{gs,editor,3}},
-          {nowarn_deprecated_function,{gs,entry,2}},
-          {nowarn_deprecated_function,{gs,entry,3}},
-          {nowarn_deprecated_function,{gs,frame,2}},
-          {nowarn_deprecated_function,{gs,frame,3}},
-          {nowarn_deprecated_function,{gs,grid,2}},
-          {nowarn_deprecated_function,{gs,grid,3}},
-          {nowarn_deprecated_function,{gs,gridline,2}},
-          {nowarn_deprecated_function,{gs,gridline,3}},
-          {nowarn_deprecated_function,{gs,image,2}},
-          {nowarn_deprecated_function,{gs,image,3}},
-          {nowarn_deprecated_function,{gs,label,2}},
-          {nowarn_deprecated_function,{gs,label,3}},
-          {nowarn_deprecated_function,{gs,line,2}},
-          {nowarn_deprecated_function,{gs,line,3}},
-          {nowarn_deprecated_function,{gs,listbox,2}},
-          {nowarn_deprecated_function,{gs,listbox,3}},
-          {nowarn_deprecated_function,{gs,menu,2}},
-          {nowarn_deprecated_function,{gs,menu,3}},
-          {nowarn_deprecated_function,{gs,menubar,2}},
-          {nowarn_deprecated_function,{gs,menubar,3}},
-          {nowarn_deprecated_function,{gs,menubutton,2}},
-          {nowarn_deprecated_function,{gs,menubutton,3}},
-          {nowarn_deprecated_function,{gs,menuitem,2}},
-          {nowarn_deprecated_function,{gs,menuitem,3}},
-          {nowarn_deprecated_function,{gs,message,2}},
-          {nowarn_deprecated_function,{gs,message,3}},
-          {nowarn_deprecated_function,{gs,oval,2}},
-          {nowarn_deprecated_function,{gs,oval,3}},
-          {nowarn_deprecated_function,{gs,polygon,2}},
-          {nowarn_deprecated_function,{gs,polygon,3}},
-          {nowarn_deprecated_function,{gs,prompter,2}},
-          {nowarn_deprecated_function,{gs,prompter,3}},
-          {nowarn_deprecated_function,{gs,radiobutton,2}},
-          {nowarn_deprecated_function,{gs,radiobutton,3}},
-          {nowarn_deprecated_function,{gs,read,2}},
-          {nowarn_deprecated_function,{gs,rectangle,2}},
-          {nowarn_deprecated_function,{gs,rectangle,3}},
-          {nowarn_deprecated_function,{gs,scale,2}},
-          {nowarn_deprecated_function,{gs,scale,3}},
-          {nowarn_deprecated_function,{gs,scrollbar,2}},
-          {nowarn_deprecated_function,{gs,scrollbar,3}},
-          {nowarn_deprecated_function,{gs,start,0}},
-          {nowarn_deprecated_function,{gs,start,1}},
-          {nowarn_deprecated_function,{gs,text,2}},
-          {nowarn_deprecated_function,{gs,text,3}},
-          {nowarn_deprecated_function,{gs,window,2}},
-          {nowarn_deprecated_function,{gs,window,3}}]).
+
+-compile([{nowarn_deprecated_function, {gs, arc, 2}},
+          {nowarn_deprecated_function, {gs, arc, 3}},
+          {nowarn_deprecated_function, {gs, button, 2}},
+          {nowarn_deprecated_function, {gs, button, 3}},
+          {nowarn_deprecated_function, {gs, canvas, 2}},
+          {nowarn_deprecated_function, {gs, canvas, 3}},
+          {nowarn_deprecated_function, {gs, checkbutton, 2}},
+          {nowarn_deprecated_function, {gs, checkbutton, 3}},
+          {nowarn_deprecated_function, {gs, config, 2}},
+          {nowarn_deprecated_function, {gs, create, 3}},
+          {nowarn_deprecated_function, {gs, create, 4}},
+          {nowarn_deprecated_function, {gs, create_tree, 2}},
+          {nowarn_deprecated_function, {gs, destroy, 1}},
+          {nowarn_deprecated_function, {gs, editor, 2}},
+          {nowarn_deprecated_function, {gs, editor, 3}},
+          {nowarn_deprecated_function, {gs, entry, 2}},
+          {nowarn_deprecated_function, {gs, entry, 3}},
+          {nowarn_deprecated_function, {gs, frame, 2}},
+          {nowarn_deprecated_function, {gs, frame, 3}},
+          {nowarn_deprecated_function, {gs, grid, 2}},
+          {nowarn_deprecated_function, {gs, grid, 3}},
+          {nowarn_deprecated_function, {gs, gridline, 2}},
+          {nowarn_deprecated_function, {gs, gridline, 3}},
+          {nowarn_deprecated_function, {gs, image, 2}},
+          {nowarn_deprecated_function, {gs, image, 3}},
+          {nowarn_deprecated_function, {gs, label, 2}},
+          {nowarn_deprecated_function, {gs, label, 3}},
+          {nowarn_deprecated_function, {gs, line, 2}},
+          {nowarn_deprecated_function, {gs, line, 3}},
+          {nowarn_deprecated_function, {gs, listbox, 2}},
+          {nowarn_deprecated_function, {gs, listbox, 3}},
+          {nowarn_deprecated_function, {gs, menu, 2}},
+          {nowarn_deprecated_function, {gs, menu, 3}},
+          {nowarn_deprecated_function, {gs, menubar, 2}},
+          {nowarn_deprecated_function, {gs, menubar, 3}},
+          {nowarn_deprecated_function, {gs, menubutton, 2}},
+          {nowarn_deprecated_function, {gs, menubutton, 3}},
+          {nowarn_deprecated_function, {gs, menuitem, 2}},
+          {nowarn_deprecated_function, {gs, menuitem, 3}},
+          {nowarn_deprecated_function, {gs, message, 2}},
+          {nowarn_deprecated_function, {gs, message, 3}},
+          {nowarn_deprecated_function, {gs, oval, 2}},
+          {nowarn_deprecated_function, {gs, oval, 3}},
+          {nowarn_deprecated_function, {gs, polygon, 2}},
+          {nowarn_deprecated_function, {gs, polygon, 3}},
+          {nowarn_deprecated_function, {gs, prompter, 2}},
+          {nowarn_deprecated_function, {gs, prompter, 3}},
+          {nowarn_deprecated_function, {gs, radiobutton, 2}},
+          {nowarn_deprecated_function, {gs, radiobutton, 3}},
+          {nowarn_deprecated_function, {gs, read, 2}},
+          {nowarn_deprecated_function, {gs, rectangle, 2}},
+          {nowarn_deprecated_function, {gs, rectangle, 3}},
+          {nowarn_deprecated_function, {gs, scale, 2}},
+          {nowarn_deprecated_function, {gs, scale, 3}},
+          {nowarn_deprecated_function, {gs, scrollbar, 2}},
+          {nowarn_deprecated_function, {gs, scrollbar, 3}},
+          {nowarn_deprecated_function, {gs, start, 0}},
+          {nowarn_deprecated_function, {gs, start, 1}},
+          {nowarn_deprecated_function, {gs, text, 2}},
+          {nowarn_deprecated_function, {gs, text, 3}},
+          {nowarn_deprecated_function, {gs, window, 2}},
+          {nowarn_deprecated_function, {gs, window, 3}}]).
 
 %%-compile(export_all).
--export([
-	 start/0,
+-export([start/0,
 	 start/1,
 	 create/3,
 	 create_named/4,
@@ -159,10 +159,7 @@
 	 map/1,
 	 unmap/1,
 	 resize/3,
-	 name_occupied/1
-	 
-	]).
-
+	 name_occupied/1]).
 
 %%
 %% gse:start()
@@ -170,15 +167,13 @@
 %%     An identifier to a top object for the graphic system
 %%
 %% Errors:
-%%     Exits with a {?MODULE,start,Reason} if there is a problem
+%%     Exits with a {?MODULE, start, Reason} if there is a problem
 %%     creating the top level graphic object.
 %%
 
-
 start() ->
     case gs:start() of
-	{error,Reason} ->
-	    exit({?MODULE, start,Reason});
+	{error, Reason} -> exit({?MODULE, start, Reason});
 	Return -> Return
     end.
 
@@ -188,25 +183,23 @@ start() ->
 %%     An identifier to a top object for the graphic system
 %%
 %% Errors:
-%%     Exits with a {?MODULE,start,Reason} if there is a problem
+%%     Exits with a {?MODULE, start, Reason} if there is a problem
 %%     creating the top level graphic object.
 %%
 
-
 start(Opts) ->
     case gs:start(Opts) of
-	{error,Reason} ->
-	    exit({?MODULE, start,Reason});
+	{error, Reason} -> exit({?MODULE, start, Reason});
 	Return -> Return
     end.
 
 %%
-%% gse:create(Objtype,Parent,Opts) replaces
+%% gse:create(Objtype, Parent, Opts) replaces
 %% the unnecessary functions:
-%%     gs:create(Obj,Parent)
-%%     gs:create(Obj,Parent,Opt)
-%%     gs:create(Obj,Parent)
-%%     gs:create(Obj,Parent)
+%%     gs:create(Obj, Parent)
+%%     gs:create(Obj, Parent, Opt)
+%%     gs:create(Obj, Parent)
+%%     gs:create(Obj, Parent)
 %%
 %% Returns:
 %%     An identifier for the created object
@@ -214,21 +207,19 @@ start(Opts) ->
 %% Errors: {?MODULE, create, Reason}, where Reason is one of:
 %%    {no_such_parent, Parent}
 %%    {unknown_type, Type}
-%%    {incvalid_option, Type, {Option,Value}}
+%%    {incvalid_option, Type, {Option, Value}}
 %%
 %%
-create(Objtype,Parent,Opts) when is_list(Opts) ->
-    case gs:create(Objtype,Parent,Opts) of
-	{error,Reason} ->
-	    exit({?MODULE, create,Reason});
+create(Objtype, Parent, Opts) when is_list(Opts) ->
+    case gs:create(Objtype, Parent, Opts) of
+	{error, Reason} -> exit({?MODULE, create, Reason});
 	Return -> Return
     end.
-    
 
 %%
-%% gse:create_named(Name, Objtype,Parent, Opts) replaces
+%% gse:create_named(Name, Objtype, Parent, Opts) replaces
 %% the confusing
-%%     gs:create(Name,Objtype, Parent, Opts)
+%%     gs:create(Name, Objtype, Parent, Opts)
 %%
 %% Returns:
 %%     An identifier for the created object
@@ -236,18 +227,15 @@ create(Objtype,Parent,Opts) when is_list
 %% Errors: {?MODULE, create, Reason}, where Reason is one of:
 %%    {no_such_parent, Parent}
 %%    {unknown_type, Type}
-%%    {incvalid_option, Type, {Option,Value}}
-%%    {name_occupied,Name}
+%%    {incvalid_option, Type, {Option, Value}}
+%%    {name_occupied, Name}
 %%
 
-create_named(Name,Objtype,Parent,Opts) when is_list(Opts) ->
-    case gs:create(Objtype,Name,Parent,Opts) of
-	{error,Reason} ->
-	    exit({?MODULE, create_named,Reason});
+create_named(Name, Objtype, Parent, Opts) when is_list(Opts) ->
+    case gs:create(Objtype, Name, Parent, Opts) of
+	{error, Reason} -> exit({?MODULE, create_named, Reason});
 	Return -> Return
     end.
-    
-
 
 %%
 %% gse:config(Object, Options) replaces
@@ -255,20 +243,18 @@ create_named(Name,Objtype,Parent,Opts) w
 %%     gs:config(Object, Opt)
 %%
 
-config(Object,Opts) when is_list(Opts) ->
-    case gs:config(Object,Opts) of
-	{error,Reason} ->
-	    exit({?MODULE, config,Reason});
+config(Object, Opts) when is_list(Opts) ->
+    case gs:config(Object, Opts) of
+	{error, Reason} -> exit({?MODULE, config, Reason});
 	Return -> Return
     end.
 
 %%
 %% gs:read(Object, OptionKey)
 %%
-read(Object,OptionKey) ->
-    case gs:read(Object,OptionKey) of
-	{error,Reason} ->
-	    exit({?MODULE, read,Reason});
+read(Object, OptionKey) ->
+    case gs:read(Object, OptionKey) of
+	{error, Reason} -> exit({?MODULE, read, Reason});
 	Return -> Return
     end.
 
@@ -278,8 +264,7 @@ read(Object,OptionKey) ->
 
 destroy(Object)->
     case gs:destroy(Object) of
-	{error,Reason} ->
-	    exit({?MODULE, destroy,Reason});
+	{error, Reason} -> exit({?MODULE, destroy, Reason});
 	Return -> Return
     end.
 
@@ -288,501 +273,144 @@ destroy(Object)->
 %%
 
 create_tree(Parent, Tree)->
-    case gs:create_tree(Parent,Tree) of
-	{error,Reason} ->
-	    exit({?MODULE, create_tree,Reason});
-	Return -> Return
-    end.
-
-
-window(Parent,Options) when is_list(Options) ->
-    case gs:window(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,window,Reason});
-	Return -> Return
-    end.
-
-named_window(Name,Parent,Options) when is_list(Options) ->
-    case gs:window(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_window,Reason});
-	Return -> Return
-    end.
-
-    
-button(Parent,Options) when is_list(Options) ->
-    case gs:button(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,button,Reason});
-	Return -> Return
-    end.
-
-
-named_button(Name,Parent,Options) when is_list(Options) ->
-    case gs:button(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_button,Reason});
-	Return -> Return
-    end.
-
-    
-checkbutton(Parent,Options) when is_list(Options) ->
-    case gs:checkbutton(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,checkbutton,Reason});
-	Return -> Return
-    end.
-
-
-named_checkbutton(Name,Parent,Options) when is_list(Options) ->
-    case gs:checkbutton(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_checkbutton,Reason});
-	Return -> Return
-    end.
-
-    
-radiobutton(Parent,Options) when is_list(Options) ->
-    case gs:radiobutton(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,radiobutton,Reason});
-	Return -> Return
-    end.
-
-
-named_radiobutton(Name,Parent,Options) when is_list(Options) ->
-    case gs:radiobutton(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_radiobutton,Reason});
-	Return -> Return
-    end.
-
-    
-frame(Parent,Options) when is_list(Options) ->
-    case gs:frame(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,frame,Reason});
-	Return -> Return
-    end.
-
-
-named_frame(Name,Parent,Options) when is_list(Options) ->
-    case gs:frame(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_frame,Reason});
-	Return -> Return
-    end.
-
-    
-canvas(Parent,Options) when is_list(Options) ->
-    case gs:canvas(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,canvas,Reason});
-	Return -> Return
-    end.
-
-
-named_canvas(Name,Parent,Options) when is_list(Options) ->
-    case gs:canvas(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_canvas,Reason});
-	Return -> Return
-    end.
-
-    
-label(Parent,Options) when is_list(Options) ->
-    case gs:label(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,label,Reason});
-	Return -> Return
-    end.
-
-
-named_label(Name,Parent,Options) when is_list(Options) ->
-    case gs:label(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_label,Reason});
-	Return -> Return
-    end.
-
-    
-message(Parent,Options) when is_list(Options) ->
-    case gs:message(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,message,Reason});
-	Return -> Return
-    end.
-
-
-named_message(Name,Parent,Options) when is_list(Options) ->
-    case gs:message(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_message,Reason});
-	Return -> Return
-    end.
-
-    
-listbox(Parent,Options) when is_list(Options) ->
-    case gs:listbox(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,listbox,Reason});
-	Return -> Return
-    end.
-
-
-named_listbox(Name,Parent,Options) when is_list(Options) ->
-    case gs:listbox(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_listbox,Reason});
-	Return -> Return
-    end.
-
-    
-entry(Parent,Options) when is_list(Options) ->
-    case gs:entry(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,entry,Reason});
-	Return -> Return
-    end.
-
-
-named_entry(Name,Parent,Options) when is_list(Options) ->
-    case gs:entry(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_entry,Reason});
-	Return -> Return
-    end.
-
-    
-scrollbar(Parent,Options) when is_list(Options) ->
-    case gs:scrollbar(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,scrollbar,Reason});
-	Return -> Return
-    end.
-
-
-named_scrollbar(Name,Parent,Options) when is_list(Options) ->
-    case gs:scrollbar(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_scrollbar,Reason});
-	Return -> Return
-    end.
-
-    
-scale(Parent,Options) when is_list(Options) ->
-    case gs:scale(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,scale,Reason});
-	Return -> Return
-    end.
-
-
-named_scale(Name,Parent,Options) when is_list(Options) ->
-    case gs:scale(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_scale,Reason});
-	Return -> Return
-    end.
-
-    
-editor(Parent,Options) when is_list(Options) ->
-    case gs:editor(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,editor,Reason});
-	Return -> Return
-    end.
-
-
-named_editor(Name,Parent,Options) when is_list(Options) ->
-    case gs:editor(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_editor,Reason});
-	Return -> Return
-    end.
-
-    
-prompter(Parent,Options) when is_list(Options) ->
-    case gs:prompter(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,prompter,Reason});
-	Return -> Return
-    end.
-
-
-named_prompter(Name,Parent,Options) when is_list(Options) ->
-    case gs:prompter(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_prompter,Reason});
-	Return -> Return
-    end.
-
-    
-line(Parent,Options) when is_list(Options) ->
-    case gs:line(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,line,Reason});
-	Return -> Return
-    end.
-
-
-named_line(Name,Parent,Options) when is_list(Options) ->
-    case gs:line(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_line,Reason});
-	Return -> Return
-    end.
-
-    
-oval(Parent,Options) when is_list(Options) ->
-    case gs:oval(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,oval,Reason});
-	Return -> Return
-    end.
-
-
-named_oval(Name,Parent,Options) when is_list(Options) ->
-    case gs:oval(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_oval,Reason});
-	Return -> Return
-    end.
-
-    
-rectangle(Parent,Options) when is_list(Options) ->
-    case gs:rectangle(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,rectangle,Reason});
-	Return -> Return
-    end.
-
-
-named_rectangle(Name,Parent,Options) when is_list(Options) ->
-    case gs:rectangle(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_rectangle,Reason});
-	Return -> Return
-    end.
-
-    
-polygon(Parent,Options) when is_list(Options) ->
-    case gs:polygon(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,polygon,Reason});
+    case gs:create_tree(Parent, Tree) of
+	{error, Reason} -> exit({?MODULE, create_tree, Reason});
 	Return -> Return
     end.
 
-
-named_polygon(Name,Parent,Options) when is_list(Options) ->
-    case gs:polygon(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_polygon,Reason});
+-define(OBJECT(O),
+O(Parent, Options) when is_list(Options) ->
+    case gs:O(Parent, Options) of
+	{error, Reason} -> exit({?MODULE, O, Reason});
 	Return -> Return
-    end.
+    end).
 
-    
-text(Parent,Options) when is_list(Options) ->
-    case gs:text(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,text,Reason});
+-define(OBJECT(O, NO),
+NO(Name, Parent, Options) when is_list(Options) ->
+    case gs:O(Name, Parent, Options) of
+	{error, Reason} -> exit({?MODULE, NO, Reason});
 	Return -> Return
-    end.
+    end).
 
+?OBJECT(window).
+?OBJECT(window, named_window).
 
-named_text(Name,Parent,Options) when is_list(Options) ->
-    case gs:text(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_text,Reason});
-	Return -> Return
-    end.
+?OBJECT(button).
+?OBJECT(button, named_button).
 
-    
-image(Parent,Options) when is_list(Options) ->
-    case gs:image(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,image,Reason});
-	Return -> Return
-    end.
+?OBJECT(checkbutton).
+?OBJECT(checkbutton, named_checkbutton).
 
+?OBJECT(radiobutton).
+?OBJECT(radiobutton, named_radiobutton).
 
-named_image(Name,Parent,Options) when is_list(Options) ->
-    case gs:image(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_image,Reason});
-	Return -> Return
-    end.
+?OBJECT(frame).
+?OBJECT(frame, named_frame).
 
-    
-arc(Parent,Options) when is_list(Options) ->
-    case gs:arc(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,arc,Reason});
-	Return -> Return
-    end.
+?OBJECT(canvas).
+?OBJECT(canvas, named_canvas).
 
+?OBJECT(label).
+?OBJECT(label, named_label).
 
-named_arc(Name,Parent,Options) when is_list(Options) ->
-    case gs:arc(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_arc,Reason});
-	Return -> Return
-    end.
+?OBJECT(message).
+?OBJECT(message, named_message).
 
-    
-menu(Parent,Options) when is_list(Options) ->
-    case gs:menu(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,menu,Reason});
-	Return -> Return
-    end.
+?OBJECT(listbox).
+?OBJECT(listbox, named_listbox).
 
+?OBJECT(entry).
+?OBJECT(entry, named_entry).
 
-named_menu(Name,Parent,Options) when is_list(Options) ->
-    case gs:menu(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_menu,Reason});
-	Return -> Return
-    end.
+?OBJECT(scrollbar).
+?OBJECT(scrollbar, named_scrollbar).
 
-    
-menubutton(Parent,Options) when is_list(Options) ->
-    case gs:menubutton(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,menubutton,Reason});
-	Return -> Return
-    end.
+?OBJECT(scale).
+?OBJECT(scale, named_scale).
 
+?OBJECT(editor).
+?OBJECT(editor, named_editor).
 
-named_menubutton(Name,Parent,Options) when is_list(Options) ->
-    case gs:menubutton(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_menubutton,Reason});
-	Return -> Return
-    end.
+?OBJECT(prompter).
+?OBJECT(prompter, named_prompter).
 
-    
-menubar(Parent,Options) when is_list(Options) ->
-    case gs:menubar(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,menubar,Reason});
-	Return -> Return
-    end.
+?OBJECT(line).
+?OBJECT(line, named_line).
 
+?OBJECT(oval).
+?OBJECT(oval, named_oval).
 
-named_menubar(Name,Parent,Options) when is_list(Options) ->
-    case gs:menubar(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_menubar,Reason});
-	Return -> Return
-    end.
+?OBJECT(rectangle).
+?OBJECT(rectangle, named_rectangle).
 
-    
-menuitem(Parent,Options) when is_list(Options) ->
-    case gs:menuitem(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,menuitem,Reason});
-	Return -> Return
-    end.
+?OBJECT(polygon).
+?OBJECT(polygon, named_polygon).
 
+?OBJECT(text).
+?OBJECT(text, named_text).
 
-named_menuitem(Name,Parent,Options) when is_list(Options) ->
-    case gs:menuitem(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_menuitem,Reason});
-	Return -> Return
-    end.
+?OBJECT(image).
+?OBJECT(image, named_image).
 
-    
-grid(Parent,Options) when is_list(Options) ->
-    case gs:grid(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,grid,Reason});
-	Return -> Return
-    end.
+?OBJECT(arc).
+?OBJECT(arc, named_arc).
 
+?OBJECT(menu).
+?OBJECT(menu, named_menu).
 
-named_grid(Name,Parent,Options) when is_list(Options) ->
-    case gs:grid(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_grid,Reason});
-	Return -> Return
-    end.
+?OBJECT(menubutton).
+?OBJECT(menubutton, named_menubutton).
 
-    
-gridline(Parent,Options) when is_list(Options) ->
-    case gs:gridline(Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,gridline,Reason});
-	Return -> Return
-    end.
+?OBJECT(menubar).
+?OBJECT(menubar, named_menubar).
 
+?OBJECT(menuitem).
+?OBJECT(menuitem, named_menuitem).
 
-named_gridline(Name,Parent,Options) when is_list(Options) ->
-    case gs:gridline(Name, Parent,Options) of
-	{error, Reason} ->
-	    exit({?MODULE,named_gridline,Reason});
-	Return -> Return
-    end.
+?OBJECT(grid).
+?OBJECT(grid, named_grid).
 
-    
+?OBJECT(gridline).
+?OBJECT(gridline, named_gridline).
 
 %% gs:config - Utility functions
 
-
 %%
 %% enable/disable
 %%
 
-enable(Object) ->
-    gse:config(Object,[{enable,true}]).
-
-disable(Object) ->
-    gse:config(Object,[{enable,false}]).
-
+enable(Object) -> gse:config(Object, [{enable, true}]).
 
+disable(Object) -> gse:config(Object, [{enable, false}]).
 
 %%
 %% select/deselect
 %%
 
-deselect(Object) ->
-    gse:config(Object,[{select,false}]).
-
-select(Object) ->
-    gse:config(Object,[{select,true}]).
+deselect(Object) -> gse:config(Object, [{select, false}]).
 
+select(Object) -> gse:config(Object, [{select, true}]).
 
 %%
 %% map/unmap
 %%
 
-map(Object) ->
-    gse:config(Object,[{map,true}]).
-
-unmap(Object) ->
-    gse:config(Object,[{map,false}]).
-
+map(Object) -> gse:config(Object, [{map, true}]).
 
+unmap(Object) -> gse:config(Object, [{map, false}]).
 
 %%
 %% resize
 %%
 
-resize(Object, Width, Height) ->
-    gse:config(Object,[{width,Width}, {height, Height}]).
-
+resize(Object, Width, Height) -> gse:config(Object, [{width, Width}, {height, Height}]).
 
- 
 %%
 %% Misc utility functions
 %%
 
 name_occupied(Name) ->
-    case gs:read(Name,id) of
-	{error,_Reason} ->
-	     false;
+    case gs:read(Name, id) of
+	{error, _Reason} -> false;
 	_Id -> true
     end.
-
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gs.erl otp_src_19.0.5-lib-gs/lib/gs/src/gs.erl
--- otp_src_19.0.5/lib/gs/src/gs.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gs.erl	2016-08-25 16:37:44.561693414 +0300
@@ -26,42 +26,42 @@
 
 -module(gs).
 -deprecated(module).
--compile([{nowarn_deprecated_function,{gs,create,3}},
-          {nowarn_deprecated_function,{gs,create,4}},
-          {nowarn_deprecated_function,{gs,create_tree,2}},
-          {nowarn_deprecated_function,{gs,foreach,3}},
-          {nowarn_deprecated_function,{gs,read,2}},
-          {nowarn_deprecated_function,{gs,start,1}}]).
+-compile([{nowarn_deprecated_function, {gs, create, 3}},
+          {nowarn_deprecated_function, {gs, create, 4}},
+          {nowarn_deprecated_function, {gs, create_tree, 2}},
+          {nowarn_deprecated_function, {gs, foreach, 3}},
+          {nowarn_deprecated_function, {gs, read, 2}},
+          {nowarn_deprecated_function, {gs, start, 1}}]).
 
 %% ----- Exports -----
 -export([start/0, stop/0, start/1]).
 -export([create/3, create/4, is_id/1]).
--export([info/1,create_tree/2]).
+-export([info/1, create_tree/2]).
 -export([config/2, read/2, destroy/1]).
 -export([get_id/1]).
 
 %% ----- Not standard but convenient -----
--export([error/2,creation_error/2,assq/2,pair/2,val/2,val/3,foreach/3]).
+-export([error/2, creation_error/2, assq/2, pair/2, val/2, val/3, foreach/3]).
 -export([create/2]).
--export([window/1,window/2,window/3,button/1,button/2,button/3]).
--export([radiobutton/1,radiobutton/2,radiobutton/3]).
--export([checkbutton/1,checkbutton/2,checkbutton/3]).
--export([frame/1,frame/2,frame/3,label/1,label/2,label/3]).
--export([message/1,message/2,message/3]).
--export([listbox/1,listbox/2,listbox/3,entry/1,entry/2,entry/3]).
--export([scrollbar/1,scrollbar/2,scrollbar/3]).
--export([scale/1,scale/2,scale/3]).
--export([canvas/1,canvas/2,canvas/3,editor/1,editor/2,editor/3]).
--export([prompter/1,prompter/2,prompter/3]).
--export([line/1,line/2,line/3,oval/1,oval/2,oval/3]).
--export([rectangle/1,rectangle/2,rectangle/3]).
--export([polygon/1,polygon/2,polygon/3]).
--export([text/1,text/2,text/3,image/1,image/2,image/3,arc/1,arc/2,arc/3]).
--export([menu/1,menu/2,menu/3,menubutton/1,menubutton/2,menubutton/3]).
--export([menubar/1,menubar/2,menubar/3]).
--export([grid/1,grid/2,grid/3]).
--export([gridline/1,gridline/2,gridline/3]).
--export([menuitem/1,menuitem/2,menuitem/3]).
+-export([window/1, window/2, window/3, button/1, button/2, button/3]).
+-export([radiobutton/1, radiobutton/2, radiobutton/3]).
+-export([checkbutton/1, checkbutton/2, checkbutton/3]).
+-export([frame/1, frame/2, frame/3, label/1, label/2, label/3]).
+-export([message/1, message/2, message/3]).
+-export([listbox/1, listbox/2, listbox/3, entry/1, entry/2, entry/3]).
+-export([scrollbar/1, scrollbar/2, scrollbar/3]).
+-export([scale/1, scale/2, scale/3]).
+-export([canvas/1, canvas/2, canvas/3, editor/1, editor/2, editor/3]).
+-export([prompter/1, prompter/2, prompter/3]).
+-export([line/1, line/2, line/3, oval/1, oval/2, oval/3]).
+-export([rectangle/1, rectangle/2, rectangle/3]).
+-export([polygon/1, polygon/2, polygon/3]).
+-export([text/1, text/2, text/3, image/1, image/2, image/3, arc/1, arc/2, arc/3]).
+-export([menu/1, menu/2, menu/3, menubutton/1, menubutton/2, menubutton/3]).
+-export([menubar/1, menubar/2, menubar/3]).
+-export([grid/1, grid/2, grid/3]).
+-export([gridline/1, gridline/2, gridline/3]).
+-export([menuitem/1, menuitem/2, menuitem/3]).
 
 -include("gstk.hrl").
 
@@ -70,308 +70,241 @@
 start() ->
     start([]).
 
-start(Opts) ->
-    Opts2 = gstk_generic:merge_default_options(gs_widgets:default_options(gs),
-					      lists:sort(Opts)),
-    gs_frontend:start(Opts2).
+start(Opts) -> gs_frontend:start(gstk_generic:merge_default_options(gs_widgets:default_options(gs), lists:sort(Opts))).
 
-stop() ->
-    gs_frontend:stop().
+stop() -> gs_frontend:stop().
 
 %% ----- Widget Commands -----
 
-create(Objtype, Parent) ->
-    GsPid = frontend(Parent),
-    tag_if_ok(gs_frontend:create(GsPid,{Objtype, undefined, obj_id(Parent),[]})
-	      ,GsPid).
+create(Objtype, Parent) -> create(Objtype, Parent, []).
 
-create(Objtype, Parent, Opts) when is_list(Opts) ->
-    GsPid = frontend(Parent),
-    tag_if_ok(gs_frontend:create(GsPid,{Objtype,undefined,obj_id(Parent),Opts}),
-	      GsPid);
-create(Objtype, Parent, Opt) ->
-    GsPid = frontend(Parent),
-    tag_if_ok(gs_frontend:create(GsPid,
-				 {Objtype,undefined,obj_id(Parent),[Opt]}),
-	      GsPid).
+create(Objtype, Parent, Opts) when is_list(Opts) -> create(Objtype, undefined, Parent, Opts).
 
 create(Objtype, Name, Parent, Opts) when is_list(Opts) -> 
     GsPid = frontend(Parent),
-    tag_if_ok(gs_frontend:create(GsPid,{Objtype, Name, obj_id(Parent),Opts}),
-	      GsPid);
-create(Objtype, Name, Parent, Opt) -> 
-    GsPid = frontend(Parent),
-    tag_if_ok(gs_frontend:create(GsPid,{Objtype,Name,obj_id(Parent),[Opt]}),
-	      GsPid).
+    tag_if_ok(gs_frontend:create(GsPid, {Objtype, Name, obj_id(Parent), Opts}), GsPid);
+create(Objtype, Name, Parent, Opt) -> create(Objtype, Name, Parent, [Opt]).
 
-tag_if_ok(Int,Pid) when is_integer(Int) ->
-    {Int,Pid};
-tag_if_ok(Err,_) ->
-    Err.
+tag_if_ok(Int, Pid) when is_integer(Int) -> {Int, Pid};
+tag_if_ok(Err, _) -> Err.
 
-config(IdOrName, Options) when is_list(Options) ->
-    gs_frontend:config(frontend(IdOrName),{obj_id(IdOrName),Options});
-config(IdOrName, Option) ->
-    gs_frontend:config(frontend(IdOrName),{obj_id(IdOrName),[Option]}).
+config(IdOrName, Options) when is_list(Options) -> gs_frontend:config(frontend(IdOrName), {obj_id(IdOrName), Options});
+config(IdOrName, Option) -> config(IdOrName, [Option]).
 
-read(IdOrName, Option) -> 
-    gs_frontend:read(frontend(IdOrName),{obj_id(IdOrName),Option}).
+read(IdOrName, Option) -> gs_frontend:read(frontend(IdOrName), {obj_id(IdOrName), Option}).
 
-destroy(IdOrName) -> 
-    gs_frontend:destroy(frontend(IdOrName),obj_id(IdOrName)).
+destroy(IdOrName) -> gs_frontend:destroy(frontend(IdOrName), obj_id(IdOrName)).
 
-get_id(Name) -> 
-    read(Name,id).
+get_id(Name) -> read(Name, id).
 
 info(version) -> "1.3.2";
-info(Option) ->
-    gs_frontend:info(Option).
+info(Option) -> gs_frontend:info(Option).
 
-is_id({Int,Pid}) when is_integer(Int), is_pid(Pid) -> true;
+is_id({Int, Pid}) -> is_integer(Int) andalso is_pid(Pid);
 is_id(_) -> false.
 
-frontend({_,Pid}) when is_pid(Pid) -> Pid;
-frontend({AtomName,Node}) when is_atom(AtomName),is_atom(Node) ->
-    rpc:call(Node,erlang,whereis,[gs_frontend]);
+frontend({_, Pid}) when is_pid(Pid) -> Pid;
+frontend({AtomName, Node}) when is_atom(AtomName), is_atom(Node) -> rpc:call(Node, erlang, whereis, [gs_frontend]);
 frontend(Atom) when is_atom(Atom) -> whereis(gs_frontend).
 
-obj_id({Id,_}) -> Id;
+obj_id({Id, _}) -> Id;
 obj_id(Atom) when is_atom(Atom) -> Atom.
 
 error(Format, Data) ->
-    io:format("gs error: "),
-    ok = io:format(Format, Data), % don't be quiet when Format is malformed
-    io:format("~n").
+    io:put_chars(standard_error, "gs error: "),
+    ok = io:format(standard_error, Format, Data), % don't be quiet when Format is malformed
+    io:nl(standard_error).
 
-creation_error(#gstkid{objtype=Ot}, {bad_result, BadResult}) ->
-    {error, {creation_error,Ot,BadResult}};
-creation_error(#gstkid{objtype=Ot}, BadResult) ->
-    {error, {creation_error,Ot,BadResult}}.
+creation_error(#gstkid{objtype = Ot}, BadResult) ->
+    {error, {creation_error, Ot, case BadResult of
+				     {bad_result, Result} -> Result;
+				     _ -> BadResult
+				 end}}.
 
+create_tree(ParentId, [{Type, Name, Options, Children}|R]) ->
+    create_tree(ParentId, Name, Type, create(Type, Name, ParentId, Options), Children, R);
+create_tree(ParentId, [{Type, Name, Options}|R]) when is_atom(Name) ->
+    create_tree(ParentId, [{Type, Name, Options, []}|R]);
+create_tree(ParentId, [{Type, Options, Children}|R]) ->
+    create_tree(ParentId, Options, Type, create(Type, ParentId, Options), Children, R);
+create_tree(ParentId, [{Type, Options}|R]) -> create_tree(ParentId, [{Type, Options, []}|R]);
+create_tree(ParentId, Tuple) when is_tuple(Tuple) -> create_tree(ParentId, [Tuple]);
+create_tree(_, []) -> ok.
 
-create_tree(ParentId,[{Type,Name,Options,Children}|R]) ->
-    case create(Type,Name,ParentId,Options) of
-	{error,_Reason} -> {error,{create_tree,aborted_at,Type,Name}};
-	Id ->
-	    case create_tree(Id,Children) of
-		ok -> create_tree(ParentId,R);
-		Err -> Err
-	    end
-    end;
-create_tree(ParentId,[{Type,Name,Options}|R]) when is_atom(Name) ->
-    create_tree(ParentId,[{Type,Name,Options,[]}|R]);
-create_tree(ParentId,[{Type,Options,Children}|R]) ->
-    case create(Type,ParentId,Options) of
-	{error,_Reason} -> {error,{create_tree,aborted_at,Type,Options}};
-	Id ->
-	    case create_tree(Id,Children) of
-		ok -> create_tree(ParentId,R);
-		Err -> Err
-	    end
-    end;
-create_tree(ParentId,[{Type,Options}|R]) ->
-    create_tree(ParentId,[{Type,Options,[]}|R]);
-create_tree(ParentId,Tuple) when is_tuple(Tuple) ->
-    create_tree(ParentId,[Tuple]);
-create_tree(_,[]) ->
-    ok.
+create_tree(_ParentId, Arg, Type, {error, _}, _Children, _R) -> {error, {create_tree, aborted_at, Type, Arg}};
+create_tree(ParentId, _Arg, _Type, Id, Children, R) ->
+    case create_tree(Id, Children) of
+	ok -> create_tree(ParentId, R);
+	Err -> Err
+    end.
 
+window(ParentId) -> window(ParentId, []).
 
-window(ParentId) -> 
-    create(window,ParentId,[]).
-window(ParentId,Options) -> 
-    create(window,ParentId,Options).
-window(Name,ParentId,Options) -> 
-    create(window,Name,ParentId,Options).
+window(ParentId, Options) -> create(window, ParentId, Options).
 
-button(ParentId) ->
-    create(button,ParentId,[]).
-button(ParentId,Options) -> 
-    create(button,ParentId,Options).
-button(Name,ParentId,Options) -> 
-    create(button,Name,ParentId,Options).
+window(Name, ParentId, Options) -> create(window, Name, ParentId, Options).
 
-checkbutton(ParentId) ->
-    create(checkbutton,ParentId,[]).
-checkbutton(ParentId,Options) -> 
-    create(checkbutton,ParentId,Options).
+button(ParentId) -> button(ParentId, []).
 
-checkbutton(Name,ParentId,Options) -> 
-    create(checkbutton,Name,ParentId,Options).
+button(ParentId, Options) -> create(button, ParentId, Options).
 
-radiobutton(ParentId) ->
-    create(radiobutton,ParentId,[]).
-radiobutton(ParentId,Options) -> 
-    create(radiobutton,ParentId,Options).
-radiobutton(Name,ParentId,Options) -> 
-    create(radiobutton,Name,ParentId,Options).
+button(Name, ParentId, Options) -> create(button, Name, ParentId, Options).
 
-frame(ParentId) -> 
-    create(frame,ParentId,[]).
-frame(ParentId,Options) ->
-    create(frame,ParentId,Options).
-frame(Name,ParentId,Options) ->
-    create(frame,Name,ParentId,Options).
+checkbutton(ParentId) -> checkbutton(ParentId, []).
 
-canvas(ParentId) ->
-    create(canvas,ParentId,[]).
-canvas(ParentId,Options) ->
-    create(canvas,ParentId,Options).
-canvas(Name,ParentId,Options) ->
-    create(canvas,Name,ParentId,Options).
+checkbutton(ParentId, Options) -> create(checkbutton, ParentId, Options).
 
-label(ParentId) ->
-    create(label,ParentId,[]).
-label(ParentId,Options) ->
-    create(label,ParentId,Options).
-label(Name,ParentId,Options) ->
-    create(label,Name,ParentId,Options).
+checkbutton(Name, ParentId, Options) -> create(checkbutton, Name, ParentId, Options).
 
-message(ParentId) ->
-    create(message,ParentId,[]).
-message(ParentId,Options) ->
-    create(message,ParentId,Options).
-message(Name,ParentId,Options) ->
-    create(message,Name,ParentId,Options).
+radiobutton(ParentId) -> radiobutton(ParentId, []).
 
-listbox(ParentId) ->
-    create(listbox,ParentId,[]).
-listbox(ParentId,Options) ->
-    create(listbox,ParentId,Options).
-listbox(Name,ParentId,Options) ->
-    create(listbox,Name,ParentId,Options).
+radiobutton(ParentId, Options) -> create(radiobutton, ParentId, Options).
 
-entry(ParentId) -> 
-    create(entry,ParentId,[]).
-entry(ParentId,Options) -> 
-    create(entry,ParentId,Options).
-entry(Name,ParentId,Options) -> 
-    create(entry,Name,ParentId,Options).
+radiobutton(Name, ParentId, Options) -> create(radiobutton, Name, ParentId, Options).
 
-scrollbar(ParentId) -> 
-    create(scrollbar,ParentId,[]).
-scrollbar(ParentId,Options) ->
-    create(scrollbar,ParentId,Options).
-scrollbar(Name,ParentId,Options) -> 
-    create(scrollbar,Name,ParentId,Options).
+frame(ParentId) -> frame(ParentId, []).
 
-scale(ParentId) -> 
-    create(scale,ParentId,[]).
-scale(ParentId,Options) -> 
-    create(scale,ParentId,Options).
-scale(Name,ParentId,Options) -> 
-    create(scale,Name,ParentId,Options).
+frame(ParentId, Options) -> create(frame, ParentId, Options).
 
-editor(ParentId) ->
-    create(editor,ParentId,[]).
-editor(ParentId,Options) ->
-    create(editor,ParentId,Options).
-editor(Name,ParentId,Options) ->
-    create(editor,Name,ParentId,Options).
+frame(Name, ParentId, Options) -> create(frame, Name, ParentId, Options).
 
-prompter(ParentId) -> 
-    create(prompter,ParentId,[]).
-prompter(ParentId,Options) ->
-    create(prompter,ParentId,Options).
-prompter(Name,ParentId,Options) -> 
-    create(prompter,Name,ParentId,Options).
+canvas(ParentId) -> canvas(ParentId, []).
 
-line(ParentId) -> 
-    create(line,ParentId,[]).
-line(ParentId,Options) ->
-    create(line,ParentId,Options).
-line(Name,ParentId,Options) -> 
-    create(line,Name,ParentId,Options).
+canvas(ParentId, Options) -> create(canvas, ParentId, Options).
 
-oval(ParentId) -> 
-    create(oval,ParentId,[]).
-oval(ParentId,Options) -> 
-    create(oval,ParentId,Options).
-oval(Name,ParentId,Options) ->
-    create(oval,Name,ParentId,Options).
+canvas(Name, ParentId, Options) -> create(canvas, Name, ParentId, Options).
 
-rectangle(ParentId) ->
-    create(rectangle,ParentId,[]).
-rectangle(ParentId,Options) -> 
-    create(rectangle,ParentId,Options).
-rectangle(Name,ParentId,Options) -> 
-    create(rectangle,Name,ParentId,Options).
+label(ParentId) -> label(ParentId, []).
 
-polygon(ParentId) ->
-    create(polygon,ParentId,[]).
-polygon(ParentId,Options) -> 
-    create(polygon,ParentId,Options).
-polygon(Name,ParentId,Options) -> 
-    create(polygon,Name,ParentId,Options).
+label(ParentId, Options) -> create(label, ParentId, Options).
 
-text(ParentId) ->
-    create(text,ParentId,[]).
-text(ParentId,Options) -> 
-    create(text,ParentId,Options).
-text(Name,ParentId,Options) -> 
-    create(text,Name,ParentId,Options).
+label(Name, ParentId, Options) -> create(label, Name, ParentId, Options).
 
-image(ParentId) ->
-    create(image,ParentId,[]).
-image(ParentId,Options) -> 
-    create(image,ParentId,Options).
-image(Name,ParentId,Options) -> 
-    create(image,Name,ParentId,Options).
+message(ParentId) -> message(ParentId, []).
 
-arc(ParentId) ->
-    create(arc,ParentId,[]).
-arc(ParentId,Options) -> 
-    create(arc,ParentId,Options).
-arc(Name,ParentId,Options) -> 
-    create(arc,Name,ParentId,Options).
+message(ParentId, Options) -> create(message, ParentId, Options).
 
-menu(ParentId) ->
-    create(menu,ParentId,[]).
-menu(ParentId, Options) ->
-    create(menu,ParentId,Options).
-menu(Name,ParentId,Options) ->
-    create(menu,Name,ParentId,Options).
+message(Name, ParentId, Options) -> create(message, Name, ParentId, Options).
 
-menubutton(ParentId) ->
-    create(menubutton,ParentId,[]).
-menubutton(ParentId,Options) -> 
-    create(menubutton,ParentId,Options).
-menubutton(Name,ParentId,Options) -> 
-    create(menubutton,Name,ParentId,Options).
+listbox(ParentId) -> listbox(ParentId, []).
 
-menubar(ParentId) -> 
-    create(menubar,ParentId,[]).
-menubar(ParentId,Options) -> 
-    create(menubar,ParentId,Options).
-menubar(Name,ParentId,Options) -> 
-    create(menubar,Name,ParentId,Options).
+listbox(ParentId, Options) -> create(listbox, ParentId, Options).
 
-menuitem(ParentId) ->
-    create(menuitem,ParentId,[]).
-menuitem(ParentId,Options) ->
-    create(menuitem,ParentId,Options).
-menuitem(Name,ParentId,Options) ->
-    create(menuitem,Name,ParentId,Options).
+listbox(Name, ParentId, Options) -> create(listbox, Name, ParentId, Options).
 
-grid(ParentId) ->
-    create(grid,ParentId,[]).
-grid(ParentId,Options) ->
-    create(grid,ParentId,Options).
-grid(Name,ParentId,Options) ->
-    create(grid,Name,ParentId,Options).
+entry(ParentId) -> entry(ParentId, []).
 
-gridline(ParentId) ->
-    create(gridline,ParentId,[]).
-gridline(ParentId,Options) ->
-    create(gridline,ParentId,Options).
-gridline(Name,ParentId,Options) ->
-    create(gridline,Name,ParentId,Options).
+entry(ParentId, Options) -> create(entry, ParentId, Options).
+
+entry(Name, ParentId, Options) -> create(entry, Name, ParentId, Options).
+
+scrollbar(ParentId) -> scrollbar(ParentId, []).
+
+scrollbar(ParentId, Options) -> create(scrollbar, ParentId, Options).
+
+scrollbar(Name, ParentId, Options) -> create(scrollbar, Name, ParentId, Options).
+
+scale(ParentId) -> scale(ParentId, []).
+
+scale(ParentId, Options) -> create(scale, ParentId, Options).
+
+scale(Name, ParentId, Options) -> create(scale, Name, ParentId, Options).
+
+editor(ParentId) -> editor(ParentId, []).
+
+editor(ParentId, Options) -> create(editor, ParentId, Options).
+
+editor(Name, ParentId, Options) -> create(editor, Name, ParentId, Options).
+
+prompter(ParentId) -> prompter(ParentId, []).
+
+prompter(ParentId, Options) -> create(prompter, ParentId, Options).
+
+prompter(Name, ParentId, Options) -> create(prompter, Name, ParentId, Options).
+
+line(ParentId) -> line(ParentId, []).
+
+line(ParentId, Options) -> create(line, ParentId, Options).
+
+line(Name, ParentId, Options) -> create(line, Name, ParentId, Options).
+
+oval(ParentId) -> oval(ParentId, []).
+
+oval(ParentId, Options) -> create(oval, ParentId, Options).
+
+oval(Name, ParentId, Options) -> create(oval, Name, ParentId, Options).
+
+rectangle(ParentId) -> rectangle(ParentId, []).
+
+rectangle(ParentId, Options) -> create(rectangle, ParentId, Options).
+
+rectangle(Name, ParentId, Options) -> create(rectangle, Name, ParentId, Options).
+
+polygon(ParentId) -> polygon(ParentId, []).
+
+polygon(ParentId, Options) -> create(polygon, ParentId, Options).
+
+polygon(Name, ParentId, Options) -> create(polygon, Name, ParentId, Options).
+
+text(ParentId) -> text(ParentId, []).
+
+text(ParentId, Options) -> create(text, ParentId, Options).
+
+text(Name, ParentId, Options) -> create(text, Name, ParentId, Options).
+
+image(ParentId) -> image(ParentId, []).
+
+image(ParentId, Options) -> create(image, ParentId, Options).
+
+image(Name, ParentId, Options) -> create(image, Name, ParentId, Options).
+
+arc(ParentId) -> arc(ParentId, []).
+
+arc(ParentId, Options) -> create(arc, ParentId, Options).
+
+arc(Name, ParentId, Options) -> create(arc, Name, ParentId, Options).
+
+menu(ParentId) -> menu(ParentId, []).
+
+menu(ParentId, Options) -> create(menu, ParentId, Options).
+
+menu(Name, ParentId, Options) -> create(menu, Name, ParentId, Options).
+
+menubutton(ParentId) -> menubutton(ParentId, []).
+
+menubutton(ParentId, Options) -> create(menubutton, ParentId, Options).
+
+menubutton(Name, ParentId, Options) -> create(menubutton, Name, ParentId, Options).
+
+menubar(ParentId) -> menubar(ParentId, []).
+
+menubar(ParentId, Options) -> create(menubar, ParentId, Options).
+
+menubar(Name, ParentId, Options) -> create(menubar, Name, ParentId, Options).
+
+menuitem(ParentId) -> menuitem(ParentId, []).
+
+menuitem(ParentId, Options) -> create(menuitem, ParentId, Options).
+
+menuitem(Name, ParentId, Options) -> create(menuitem, Name, ParentId, Options).
+
+grid(ParentId) -> grid(ParentId, []).
+
+grid(ParentId, Options) -> create(grid, ParentId, Options).
+
+grid(Name, ParentId, Options) -> create(grid, Name, ParentId, Options).
+
+gridline(ParentId) -> gridline(ParentId, []).
+
+gridline(ParentId, Options) -> create(gridline, ParentId, Options).
+
+gridline(Name, ParentId, Options) -> create(gridline, Name, ParentId, Options).
 
 %%----------------------------------------------------------------------
 %% Waiting for erl44
 %%----------------------------------------------------------------------
-foreach(F, ExtraArgs, [H | T]) ->
-    apply(F, [H | ExtraArgs]),
+foreach(F, ExtraArgs, [H|T]) ->
+    apply(F, [H|ExtraArgs]),
     foreach(F, ExtraArgs, T);
 foreach(_F, _ExtraArgs, []) -> ok.
 
@@ -379,30 +312,24 @@ foreach(_F, _ExtraArgs, []) -> ok.
 %% ASSociation with eQual key (scheme standard)
 %%----------------------------------------------------------------------
 assq(Key, List) ->
-    case lists:keysearch(Key, 1, List) of
-	{value, {_, Val}} -> {value, Val};
+    case lists:keyfind(Key, 1, List) of
+	{_, Val} -> {value, Val};
 	_ -> false
     end.
 
 %%----------------------------------------------------------------------
 %% When we need the whole pair.
 %%----------------------------------------------------------------------
-pair(Key, List) ->
-    case lists:keysearch(Key, 1, List) of
-	{value, Pair} -> Pair;
-	_ -> false
-    end.
+pair(Key, List) -> lists:keyfind(Key, 1, List).
 
 %%----------------------------------------------------------------------
 %% When we know there is a value
 %%----------------------------------------------------------------------
-val(Key, List) when is_list(List) ->
-    {value, {_,Val}} = lists:keysearch(Key, 1, List),
-    Val.
+val(Key, List) -> val(Key, List, false).
 
-val(Key,List,ElseVal) when is_list(List) ->
-    case lists:keysearch(Key, 1, List) of
-	{value, {_, Val}} -> Val;
+val(Key, List, ElseVal) when is_list(List) ->
+    case lists:keyfind(Key, 1, List) of
+	{_, Val} -> Val;
 	_ -> ElseVal
     end.
 
diff -Ndurp otp_src_19.0.5/lib/gs/src/gs_frontend.erl otp_src_19.0.5-lib-gs/lib/gs/src/gs_frontend.erl
--- otp_src_19.0.5/lib/gs/src/gs_frontend.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gs_frontend.erl	2016-08-25 16:37:44.561693414 +0300
@@ -25,8 +25,9 @@
 %%
 
 -module(gs_frontend).
--compile([{nowarn_deprecated_function,{gs,assq,2}},
-          {nowarn_deprecated_function,{gs,error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, assq, 2}},
+          {nowarn_deprecated_function, {gs, error, 2}}]).
 
 -export([create/2,
 	 config/2,
@@ -38,48 +39,38 @@
 	 init/1,
 	 event/3]).
 
-
 -include("gstk.hrl").
 
-
 %%----------------------------------------------------------------------
-%% The ets contains: {Obj,lives}|{Obj,{Name,Pid}}
-%% new obj is {Int,Node}
-%%                   {{Name,Pid},Obj}
+%% The ets contains: {Obj, lives}|{Obj, {Name, Pid}}
+%% new obj is {Int, Node}
+%%                   {{Name, Pid}, Obj}
 %%----------------------------------------------------------------------
--record(state, {db,user,user_count,kernel,kernel_count,self}).
+-record(state, {db, user, user_count, kernel, kernel_count, self}).
 
 %%----------------------------------------------------------------------
 %% The interface.
 %%----------------------------------------------------------------------
-create(GsPid,Args) -> 
-    request(GsPid,{create,Args}).
-
-config(GsPid,Args) ->
-    request(GsPid,{config, Args}).
+create(GsPid, Args) -> request(GsPid, {create, Args}).
 
-read(GsPid,Args) -> 
-    request(GsPid,{read, Args}).
+config(GsPid, Args) -> request(GsPid, {config, Args}).
 
-destroy(GsPid,IdOrName) -> 
-    request(GsPid,{destroy, IdOrName}).
+read(GsPid, Args) -> request(GsPid, {read, Args}).
 
-info(Option) ->
-    request(gs_frontend,{info,Option}).
+destroy(GsPid, IdOrName) -> request(GsPid, {destroy, IdOrName}).
 
+info(Option) -> request(gs_frontend, {info, Option}).
 
 %%----------------------------------------------------------------------
 %% Comment: Frontend is only locally registered. These functions are called
 %%          by any backend.
 %%----------------------------------------------------------------------
-event(FrontEnd,ToOwner,EventMsg) ->
-    FrontEnd ! {event, ToOwner,EventMsg}.
-
+event(FrontEnd, ToOwner, EventMsg) -> FrontEnd ! {event, ToOwner, EventMsg}.
 
-request(GsPid,Msg) ->
-    GsPid ! {self(),Msg},
+request(GsPid, Msg) ->
+    GsPid ! {self(), Msg},
     receive
-	{gs_reply,R} -> R
+	{gs_reply, R} -> R
     end.
 
 %%----------------------------------------------------------------------
@@ -89,27 +80,23 @@ request(GsPid,Msg) ->
 start(Opts) ->
     case whereis(gs_frontend) of
 	undefined ->
-	    P = spawn_link(gs_frontend,init,[Opts]),
+	    P = spawn_link(gs_frontend, init, [Opts]),
 	    case catch register(gs_frontend, P) of
-		true ->
-		    request(gs_frontend,{instance, backend_name(Opts), Opts});
+		true -> request(gs_frontend, {instance, backend_name(Opts), Opts});
 		{'EXIT', _} ->
-		    exit(P,kill), % a raise... and I lost this time
-		    start(Opts)   
+		    exit(P, kill), % a raise... and I lost this time
+		    start(Opts)
 	    end;
-	P ->
-	    request(P,{instance,backend_name(Opts),Opts})
+	P -> request(P, {instance, backend_name(Opts), Opts})
     end.
 
 backend_name(Opts) ->
-    case gs:assq(kernel,Opts) of
-	{value,true} -> kernel;
+    case gs:assq(kernel, Opts) of
+	{value, true} -> kernel;
 	_ -> user
     end.
 
-
-stop() ->
-    request(gs_frontend,stop).
+stop() -> request(gs_frontend, stop).
 
 %% ------------------------------------------------------------
 %%       THE FRONT END SERVER
@@ -118,254 +105,176 @@ stop() ->
 %%
 init(_Opts) ->
     process_flag(trap_exit, true),
-    DB=ets:new(gs_names,[set,public]),
-    loop(#state{db=DB,self=self()}).
+    loop(#state{db = ets:new(gs_names, [set, public]), self = self()}).
 
 loop(State) ->
     receive
-	X ->
-						%	    io:format("frontend received: ~p~n",[X]),
-	    case catch (doit(X,State)) of
-		done -> loop(State);
-		NewState when is_record(NewState,state) ->
-		    loop(NewState);
-		stop -> stop;
-		Reason ->
-		    io:format("GS frontend. Last mgs in was:~p~n",[X]),
-		    io:format("exit:~p~n",[X]),
-		    io:format("Reason: ~p~n", [Reason]),
-		    terminate(Reason,State),
-		    exit(Reason)
-	    end
+	X -> case catch doit(X, State) of
+		 done -> loop(State);
+		 #state{} = NewState -> loop(NewState);
+		 stop -> stop;
+		 Reason ->
+		     io:format("GS frontend. Last mgs in was:~p~nexit:~p~nReason: ~p~n", [X, X, Reason]),
+		     terminate(Reason, State),
+		     exit(Reason)
+	     end
     end.
 
-reply(To,Msg) ->
-    To ! {gs_reply,Msg},
+reply(To, Msg) ->
+    To ! {gs_reply, Msg},
     done.
 
-doit({FromOwner,{config, Args}},State) ->
-    {IdOrName, Opts} = Args,
-    #state{db=DB} = State,
-    case idOrName_to_id(DB,IdOrName,FromOwner) of
-	undefined ->
-	    reply(FromOwner,{error,{no_such_object,IdOrName}});
-	Obj ->
-	    reply(FromOwner,gstk:config(backend(State,Obj),{Obj,Opts}))
-    end;
-
-doit({event,ToOwner,{gs,Obj,Etype,Data,Args}}, #state{db=DB,self=Self}) ->
-    case ets:lookup(DB,Obj) of
-	[{_,{Name,ToOwner}}] -> ToOwner ! {gs,Name,Etype,Data,Args};
-	_ -> ToOwner ! {gs,{Obj,Self},Etype,Data,Args}
+doit({FromOwner, {config, {IdOrName, Opts}}}, #state{db = DB} = State) ->
+    reply(FromOwner, case idOrName_to_id(DB, IdOrName, FromOwner) of
+			 undefined -> {error, {no_such_object, IdOrName}};
+			 Obj -> gstk:config(backend(State, Obj), {Obj, Opts})
+		     end);
+doit({event, ToOwner, {gs, Obj, Etype, Data, Args}}, #state{db = DB, self = Self}) ->
+    case ets:lookup(DB, Obj) of
+	[{_, {Name, ToOwner}}] -> ToOwner ! {gs, Name, Etype, Data, Args};
+	_ -> ToOwner ! {gs, {Obj, Self}, Etype, Data, Args}
     end,
     done;
-
-doit({FromOwner,{create,Args}}, State) ->
-    {Objtype, Name, Parent, Opts} = Args,
-    #state{db=DB} = State,
-    NameOccupied = case {Name, ets:lookup(DB,{Name,FromOwner})} of
-		       {undefined,_} -> false;
+doit({FromOwner, {create, {Objtype, Name, Parent, Opts}}}, #state{db = DB} = State) ->
+    NameOccupied = case {Name, ets:lookup(DB, {Name, FromOwner})} of
+		       {undefined, _} -> false;
 		       {_, []} -> false;
 		       _ -> true
 		   end,
-    if NameOccupied == true ->
-	    reply(FromOwner, {error,{name_occupied,Name}});
-       true -> 
-	    case idOrName_to_id(DB,Parent,FromOwner) of
-		undefined ->
-		    reply(FromOwner, {error,{no_such_parent,Parent}});
+    if
+	NameOccupied -> reply(FromOwner, {error, {name_occupied, Name}});
+	true -> case idOrName_to_id(DB, Parent, FromOwner) of
+		undefined -> reply(FromOwner, {error, {no_such_parent, Parent}});
 		ParentObj ->
-		    {Id,NewState} = inc(ParentObj,State),
-		    case gstk:create(backend(State,ParentObj),
-				     {FromOwner,{Objtype,Id,ParentObj,Opts}}) of
+		    {Id, NewState} = inc(ParentObj, State),
+		    case gstk:create(backend(State, ParentObj), {FromOwner, {Objtype, Id, ParentObj, Opts}}) of
 			ok ->
 			    link(FromOwner),
-			    if Name == undefined ->
-				    ets:insert(DB,{Id,lives}),
-				    reply(FromOwner, Id),
-				    NewState;
-			       true -> % it's a real name, register it
-				    NamePid = {Name,FromOwner},
-				    ets:insert(DB,{NamePid,Id}),
-				    ets:insert(DB,{Id,NamePid}),
-				    reply(FromOwner,Id),
-				    NewState
-			    end;
-			Err -> reply(FromOwner,Err)
+			    ets:insert(DB, {Id, if
+						    Name =:= undefined -> lives;
+						    true ->
+							NamePid = {Name, FromOwner},
+							ets:insert(DB, {NamePid, Id}),
+							NamePid
+						end}),
+			    reply(FromOwner, Id),
+			    NewState;
+			Err -> reply(FromOwner, Err)
 		    end
 	    end
     end;
-
-doit({FromOwner,{read, Args}}, State) ->
-    #state{db=DB} = State,    
-    {IdOrName, Opt} = Args,
-    case idOrName_to_id(DB,IdOrName,FromOwner) of
-	undefined ->
-	    reply(FromOwner,{error,{no_such_object,IdOrName}});
-	Obj -> 
-	    reply(FromOwner,gstk:read(backend(State,Obj),{Obj,Opt}))
+doit({FromOwner, {read, {IdOrName, Opt}}}, #state{db = DB} = State) ->
+    case idOrName_to_id(DB, IdOrName, FromOwner) of
+	undefined -> reply(FromOwner, {error, {no_such_object, IdOrName}});
+	Obj -> reply(FromOwner, gstk:read(backend(State, Obj), {Obj, Opt}))
     end;
-
-doit({'EXIT', UserBackend, Reason}, State)
-  when State#state.user == UserBackend ->
+doit({'EXIT', UserBackend, Reason}, #state{user = UserBackend, db = DB} = State) ->
     gs:error("user backend died reason ~w~n", [Reason]),
-    remove_user_objects(State#state.db),
-    State#state{user=undefined};  
-
-doit({'EXIT', KernelBackend, Reason}, State)
-  when State#state.kernel == KernelBackend ->
+    remove_user_objects(DB),
+    State#state{user = undefined};
+doit({'EXIT', KernelBackend, Reason}, #state{kernel = KernelBackend}) ->
     gs:error("kernel backend died reason ~w~n", [Reason]),
-    exit({gs_kernel_died,Reason});
-
-doit({'EXIT', Pid, _Reason}, #state{kernel=K,user=U,db=DB}) ->
+    exit({gs_kernel_died, Reason});
+doit({'EXIT', Pid, _Reason}, #state{kernel = K, user = U, db = DB}) ->
     %% io:format("Pid ~w died reason ~w~n", [Pid, _Reason]),
-    if is_pid(U) -> 
-	    DeadObjU = gstk:pid_died(U,Pid),
-	    remove_objs(DB,DeadObjU);
-       true -> ok
-    end,
-    if is_pid(K) ->
-	    DeadObjK = gstk:pid_died(K,Pid),
-	    remove_objs(DB,DeadObjK);
-       true -> true end,
+    lists:foreach(fun(P) -> is_pid(P) andalso remove_objs(DB, gstk:pid_died(P, Pid)) end, [U, K]),
     done;
-
-doit({FromOwner,{destroy, IdOrName}}, State) ->
-    #state{db=DB} = State,
-    case idOrName_to_id(DB,IdOrName,FromOwner) of
-	undefined ->
-	    reply(FromOwner, {error,{no_such_object,IdOrName}});
-	Obj ->
-	    DeadObj = gstk:destroy(backend(State,Obj),Obj),
-	    remove_objs(DB,DeadObj),
-	    reply(FromOwner,done)	    
-    end;
-
-doit({From,{instance,user,Opts}},State) ->
-    #state{db=DB, self=Self, user_count=UC} = State,
-    case ets:lookup(DB,1) of
-	[_] -> reply(From, {1,Self});
+doit({FromOwner, {destroy, IdOrName}}, #state{db = DB} = State) ->
+    reply(FromOwner, case idOrName_to_id(DB, IdOrName, FromOwner) of
+			 undefined -> {error, {no_such_object, IdOrName}};
+			 Obj ->
+			     remove_objs(DB, gstk:destroy(backend(State, Obj), Obj)),
+			     done
+		     end);
+doit({From, {instance, user, Opts}}, #state{db = DB, self = Self} = State) ->
+    case ets:lookup(DB, 1) of
+	[_] -> reply(From, {1, Self});
 	[] ->
-	    ets:insert(DB,{1,lives}), % parent of all user gs objs
+	    ets:insert(DB, {1, lives}), % parent of all user gs objs
 	    case gstk:start_link(1, Self, Self, Opts) of
 		{ok, UserBackend} ->
 		    reply(From, {1, Self}),
-		    case UC of
-			undefined -> 
-			    State#state{user_count=1, user=UserBackend};
-			_N ->
-			    State#state{user_count=UC+2, user=UserBackend}
-		    end;
+		    State#state{user_count = case State of
+						 #state{user_count = undefined} -> 1;
+						 #state{user_count = UC} -> UC + 2
+					     end,
+					     user = UserBackend};
 		{error, Reason} ->
 		    reply(From, {error, Reason}),
 		    stop
 	    end
     end;
-
-doit({From,{instance,kernel,Opts}},State) ->
-    #state{db=DB,self=Self} = State,
-    case ets:lookup(DB,0) of
-	[_] -> reply(From, {0,Self});
+doit({From, {instance, kernel, Opts}}, #state{db = DB, self = Self} = State) ->
+    case ets:lookup(DB, 0) of
+	[_] -> reply(From, {0, Self});
 	[] ->
-	    ets:insert(DB,{0,lives}), % parent of all user gs objs
-	    case gstk:start_link(0,Self,Self,Opts) of
+	    ets:insert(DB, {0, lives}), % parent of all user gs objs
+	    case gstk:start_link(0, Self, Self, Opts) of
 		{ok, KernelBackend} ->
-		    reply(From, {0,Self}),
-		    State#state{kernel_count=0,kernel=KernelBackend};
+		    reply(From, {0, Self}),
+		    State#state{kernel_count = 0, kernel = KernelBackend};
 		{error, Reason} ->
-		    reply(From, {error,Reason}),
+		    reply(From, {error, Reason}),
 		    stop
 	    end
     end;
-
-
-doit({From,stop}, State) ->
-    #state{kernel=K,user=U} = State,
-    if is_pid(U) -> gstk:stop(U);
-       true -> true end,
-    if is_pid(K) -> gstk:stop(K);
-       true -> true end,
-    reply(From,stopped),
+doit({From, stop}, #state{kernel = K, user = U}) ->
+    lists:foreach(fun(P) -> is_pid(P) andalso gstk:stop(P) end, [U, K]),
+    reply(From, stopped),
     stop;
+doit({From, {gstk, user, Msg}}, #state{user = U}) -> reply(From, gstk:request(U, Msg));
+doit({From, {gstk, kernel, Msg}}, #state{kernel = K}) -> reply(From, gstk:request(K, Msg));
+doit({From, {info, gs_db}}, #state{db = DB} = State) ->
+    io:format("gs_db: ~p~n", [ets:tab2list(DB)]),
+    reply(From, State);
+doit({From, {info, kernel_db}}, #state{kernel = K}) -> reply(From, gstk:request(K, dump_db));
+doit({From, {info, user_db}}, #state{user = U}) -> reply(From, gstk:request(U, dump_db));
+doit({From, {info, Unknown}}, _State) ->
+    io:format("gs: unknown info option '~w', use one of 'gs_db', 'kernel_db' or 'user_db'~n", [Unknown]),
+    reply(From, ok).
 
-doit({From,{gstk,user,Msg}},State) ->
-    reply(From,gstk:request(State#state.user,Msg));
-doit({From,{gstk,kernel,Msg}},State) ->
-    reply(From,gstk:request(State#state.kernel,Msg));
-
-doit({From,{info,gs_db}},State) ->
-    io:format("gs_db:~p~n",[ets:tab2list(State#state.db)]),
-    reply(From,State);
-doit({From,{info,kernel_db}},State) ->
-    reply(From,gstk:request(State#state.kernel,dump_db));
-doit({From,{info,user_db}},State) ->
-    reply(From,gstk:request(State#state.user,dump_db));
-doit({From,{info,Unknown}},_State) ->
-    io:format("gs: unknown info option '~w', use one of 'gs_db', 'kernel_db' or 'user_db'~n",[Unknown]),
-    reply(From,ok).
-
-terminate(_Reason,#state{db=DB}) ->
-    if DB==undefined -> ok;
-       true ->
-						%	    io:format("frontend db:~p~n",[ets:tab2list(DB)])
-	    ok
-    end.
-
+terminate(_Reason, #state{db = undefined}) -> ok;
+terminate(_Reason, #state{db = _DB}) ->
+    %io:format("frontend db: ~p~n", [ets:tab2list(_DB)])
+    ok.
 
-backend(#state{user=Upid,kernel=Kpid},Obj) ->
-    if Obj rem 2 == 0 -> Kpid;
-       true -> Upid
-    end.
+backend(#state{kernel = K}, Obj) when Obj rem 2 =:= 0 -> K;
+backend(#state{user = U}, _Obj) -> U.
 
 %%----------------------------------------------------------------------
-%% Returns: {NewId,NewState}
+%% Returns: {NewId, NewState}
 %%----------------------------------------------------------------------
-inc(ParInt,State) when ParInt rem 2 == 1 ->
-    X=State#state.user_count+2,
-    {X,State#state{user_count=X}};
-inc(ParInt,State) when ParInt rem 2 == 0 ->
-    X=State#state.kernel_count+2,
-    {X,State#state{kernel_count=X}}.
+inc(ParInt, #state{kernel_count = C} = State) when ParInt rem 2 =:= 0 ->
+    X = C + 2,
+    {X, State#state{kernel_count = X}};
+inc(_ParInt, #state{user_count = C} = State) ->
+    X = C + 2,
+    {X, State#state{user_count = X}}.
 
-remove_user_objects(DB) ->
-    DeadObj = find_user_obj(ets:first(DB),DB),
-    remove_objs(DB,DeadObj).
+remove_user_objects(DB) -> remove_objs(DB, find_user_obj(ets:first(DB), DB)).
 
-find_user_obj(Int,DB) when is_integer(Int) ->
-    if Int rem 2 == 0 -> %% a kernel obj
-	    find_user_obj(ets:next(DB,Int),DB);
-       true -> %% a user obj
-	    [Int|find_user_obj(ets:next(DB,Int),DB)]
-    end;
-find_user_obj('$end_of_table',_DB) ->
-    [];
-find_user_obj(OtherKey,DB) ->
-    find_user_obj(ets:next(DB,OtherKey),DB).
+find_user_obj('$end_of_table', _DB) -> [];
+find_user_obj(Int, DB) when Int rem 2 =/= 0 -> [Int|find_user_obj(ets:next(DB, Int), DB)];
+find_user_obj(OtherKey, DB) -> find_user_obj(ets:next(DB, OtherKey), DB).
 
-remove_objs(DB,[Obj|Objs]) ->
+remove_objs(DB, [Obj|Objs]) ->
     case ets:lookup(DB, Obj) of
-	[{_,NamePid}] ->
-	    ets:delete(DB,Obj),
-	    ets:delete(DB,NamePid);
+	[{_, NamePid}] -> lists:foreach(fun(O) -> ets:delete(DB, O) end, [Obj, NamePid]);
 	[] -> backend_only
     end,
-    remove_objs(DB,Objs);
-remove_objs(_DB,[]) -> done.
+    remove_objs(DB, Objs);
+remove_objs(_DB, []) -> done.
 
-idOrName_to_id(DB,IdOrName,Pid) when is_atom(IdOrName) ->
-    case ets:lookup(DB,{IdOrName,Pid}) of
-	[{_,Obj}] -> Obj;
+idOrName_to_id(DB, IdOrName, Pid) when is_atom(IdOrName) ->
+    case ets:lookup(DB, {IdOrName, Pid}) of
+	[{_, Obj}] -> Obj;
 	_ -> undefined
     end;
-idOrName_to_id(DB,Obj,_Pid) ->
-    case ets:lookup(DB,Obj) of
+idOrName_to_id(DB, Obj, _Pid) ->
+    case ets:lookup(DB, Obj) of
 	[_] -> Obj;
 	_ -> undefined
     end.
 
-
-
-
 %% ----------------------------------------
 %% done
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gs_make.erl otp_src_19.0.5-lib-gs/lib/gs/src/gs_make.erl
--- otp_src_19.0.5/lib/gs/src/gs_make.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gs_make.erl	2016-08-25 16:37:44.561693414 +0300
@@ -20,247 +20,223 @@
 
 %%
 -module(gs_make).
--compile([{nowarn_deprecated_function,{gs,assq,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, assq, 2}}]).
 
 -export([start/0]).
 
 start() ->
-    Terms = the_config(),
-    DB=fill_ets(Terms),
-    {ok,OutFd} = file:open("gstk_generic.hrl", [write]),
-    put(stdout,OutFd),
-%    io:format("terms: ~p ~n ets:~p~n",[Terms,ets:tab2list(DB)]),
+    DB = fill_ets(the_config()),
+    {ok, OutFd} = file:open("gstk_generic.hrl", [write]),
+    put(stdout, OutFd),
     p("% Don't edit this file. It was generated by gs_make:start/0 "),
-    p("at ~p-~p-~p, ~p:~p:~p.\n\n",
-      lists:append(tuple_to_list(date()),tuple_to_list(time()))),
+    p("at ~p-~p-~p, ~p:~p:~p.\n\n", lists:append(tuple_to_list(date()), tuple_to_list(time()))),
     gen_out_opts(DB),
     gen_read(DB),
     file:close(OutFd),
-    {ok,"gstk_generic.hrl",DB}.
+    {ok, "gstk_generic.hrl", DB}.
 
-fill_ets(Terms) ->
-    DB = ets:new(gs_mapping,[bag,public]),
-    fill_ets(DB,Terms).
+fill_ets(Terms) -> fill_ets(ets:new(gs_mapping, [bag, public]), Terms).
 
-fill_ets(DB,[]) -> DB;
-fill_ets(DB,[{Objs,Opt,Fun,Access}|Terms]) ->
-    fill_ets(DB,lists:flatten(Objs),Opt,Fun,Access),
-    fill_ets(DB,Terms).
+fill_ets(DB, []) -> DB;
+fill_ets(DB, [{Objs, Opt, Fun, Access}|Terms]) ->
+    fill_ets(DB, lists:flatten(Objs), Opt, Fun, Access),
+    fill_ets(DB, Terms).
 
-fill_ets(_DB,[],_,_,_) -> done;
-fill_ets(DB,[Obj|Objs],Opt,Fun,rw) ->
-    ets:insert(DB,{Obj,Opt,Fun,read}),
-    ets:insert(DB,{Obj,Opt,Fun,write}),
-    fill_ets(DB,Objs,Opt,Fun,rw);
-fill_ets(DB,[Obj|Objs],Opt,Fun,r) ->
-    ets:insert(DB,{Obj,Opt,Fun,read}),
-    fill_ets(DB,Objs,Opt,Fun,r);
-fill_ets(DB,[Obj|Objs],Opt,Fun,w) ->
-    ets:insert(DB,{Obj,Opt,Fun,write}),
-    fill_ets(DB,Objs,Opt,Fun,w).
+fill_ets(_DB, [], _, _, _) -> done;
+fill_ets(DB, [Obj|Objs], Opt, Fun, rw) ->
+    lists:foreach(fun(E) -> ets:insert(DB, {Obj, Opt, Fun, E}) end, [read, write]),
+    fill_ets(DB, Objs, Opt, Fun, rw);
+fill_ets(DB, Objs, Opt, Fun, r) -> fill_ets(DB, Objs, Opt, Fun, r, read);
+fill_ets(DB, Objs, Opt, Fun, w) -> fill_ets(DB, Objs, Opt, Fun, w, write).
+
+fill_ets(DB, [Obj|Objs], Opt, Fun, RW, A) ->
+    ets:insert(DB, {Obj, Opt, Fun, A}),
+    fill_ets(DB, Objs, Opt, Fun, RW).
 
-    
-    
 gen_out_opts(DB) ->
-    ObjTypes = lists:flatten(ordsets:from_list(ets:match(DB,{'$1','_','_',write}))),
-    p("out_opts([Option|Options],Gstkid,TkW,DB,ExtraArg,S,P,C) ->\n"),
-    p("  {Opt,Val} =\n"),
+    p("out_opts([Option|Options], Gstkid, TkW, DB, ExtraArg, S,P, C) ->\n"),
+    p("  {Opt, Val} =\n"),
     p("    case Option of \n"),
-    p("      {{default,Cat,Key},V} -> {default,{Cat,{Key,V}}};\n"),
-    p("      {_Key,_V} -> Option;\n"),
-    p("      {default,Cat,Opti} -> {default,{Cat,Opti}};\n"),
-    p("      Atom when is_atom(Atom) -> {Atom,undefined};\n"),
-    p("      _ -> {error, {invalid_option,Option}}\n"),
+    p("      {{default, Cat, Key}, V} -> {default, {Cat, {Key, V}}};\n"),
+    p("      {_Key, _V} -> Option;\n"),
+    p("      {default, Cat, Opti} -> {default, {Cat, Opti}};\n"),
+    p("      Atom when is_atom(Atom) -> {Atom, undefined};\n"),
+    p("      _ -> {error, {invalid_option, Option}}\n"),
     p("    end,\n"),
     p("  case Gstkid#gstkid.objtype of\n"),
-    gen_out_type_case_clauses(merge_types(ObjTypes),DB),
-    p("    Q -> exit({internal_error,unknown_objtype,Q})\n"),
+    gen_out_type_case_clauses(merge_types(lists:flatten(ordsets:from_list(ets:match(DB, {'$1', '_', '_', write})))),
+			      DB),
+    p("    Q -> exit({internal_error, unknown_objtype, Q})\n"),
     p("  end;\n"),
-    p("out_opts([],_Gstkid,_TkW,_DB,_ExtraArg,S,P,C) -> \n"),
-    p("  {S,P,C}.\n").
-
+    p("out_opts([], _Gstkid, _TkW, _DB, _ExtraArg, S,P, C) -> \n"),
+    p("  {S, P,C}.\n").
 
-gen_out_type_case_clauses([],_DB) -> done;
-gen_out_type_case_clauses([Objtype|Objtypes],DB) ->
-    OptsFuns = lists:map(fun(L) -> list_to_tuple(L) end,
-			 ets:match(DB,{Objtype,'$1','$2',write})),
-    p("   ~p -> \ncase Opt of\n",[Objtype]),
-    gen_opt_case_clauses(merge_opts(opt_prio(),OptsFuns)),
+gen_out_type_case_clauses([], _DB) -> done;
+gen_out_type_case_clauses([Objtype|Objtypes], DB) ->
+    p("   ~p -> \ncase Opt of\n", [Objtype]),
+    gen_opt_case_clauses(merge_opts(opt_prio(),
+			 lists:map(fun list_to_tuple/1, ets:match(DB, {Objtype, '$1', '$2', write})))),
     p("  _ -> \n"),
-    p("    handle_external_opt_call([Option|Options],Gstkid,TkW,DB,ExtraArg,"
-      "                             gstk_~p:option(Option,Gstkid,TkW,DB,ExtraArg),S,P,C)\n",
+    p("    handle_external_opt_call([Option|Options], Gstkid, TkW, DB, ExtraArg,"
+      "                             gstk_~p:option(Option, Gstkid, TkW, DB, ExtraArg), S,P, C)\n",
       [Objtype]),
     p("  end;\n"),
-    gen_out_type_case_clauses(Objtypes,DB).
+    gen_out_type_case_clauses(Objtypes, DB).
 
-gen_opt_case_clauses([]) ->
-    done;
-gen_opt_case_clauses([{Opt,Fun}|OptFuncs]) ->
-    p("  ~p ->\n",[Opt]),
-    p("    ~p(Val,Options,Gstkid,TkW,DB,ExtraArg,S,P,C);\n",[Fun]),
+gen_opt_case_clauses([]) -> done;
+gen_opt_case_clauses([{Opt, Fun}|OptFuncs]) ->
+    p("  ~p ->\n", [Opt]),
+    p("    ~p(Val, Options, Gstkid, TkW, DB, ExtraArg, S,P, C);\n", [Fun]),
     gen_opt_case_clauses(OptFuncs).
 
 gen_read(DB) ->
-    ObjTypes = lists:flatten(ordsets:from_list(ets:match(DB,{'$1','_','_',read}))),
-    p("read_option(DB,Gstkid,TkW,Option,ExtraArg) ->\n"),
+    p("read_option(DB, Gstkid, TkW, Option, ExtraArg) ->\n"),
     p("  Key = case Option of\n"),
     p("    Atom when is_atom(Atom) -> Atom;\n"),
-    p("    Opt when is_tuple(Opt) -> element(1,Opt)\n"),
+    p("    Opt when is_tuple(Opt) -> element(1, Opt)\n"),
     p("  end,\n"),
     p("  case Gstkid#gstkid.objtype of\n"),
-    gen_read_type_clauses(merge_types(ObjTypes),DB),
-    p("    Q -> exit({internal_error,unknown_objtype,Q})\n"),
+    gen_read_type_clauses(merge_types(lists:flatten(ordsets:from_list(ets:match(DB, {'$1', '_', '_', read})))), DB),
+    p("    Q -> exit({internal_error, unknown_objtype, Q})\n"),
     p("  end.\n").
-    
 
-gen_read_type_clauses([],_) -> done;
-gen_read_type_clauses([Objtype|Objtypes],DB) ->
-    OptsFuns = lists:map(fun(L) -> list_to_tuple(L) end,
-			 ets:match(DB,{Objtype,'$1','$2',read})),
-    p("  ~p -> \ncase Key of\n",[Objtype]),
-    gen_readopt_case_clauses(merge_opts(opt_prio(),OptsFuns)),
-    p("  _ -> \nhandle_external_read(gstk_~p:read_option(Option,Gstkid,TkW,DB,ExtraArg))\n",[Objtype]),
+gen_read_type_clauses([], _) -> done;
+gen_read_type_clauses([Objtype|Objtypes], DB) ->
+    p("  ~p -> \ncase Key of\n", [Objtype]),
+    gen_readopt_case_clauses(merge_opts(opt_prio(),
+			     lists:map(fun list_to_tuple/1, ets:match(DB, {Objtype, '$1', '$2', read})))),
+    p("  _ -> \nhandle_external_read(gstk_~p:read_option(Option, Gstkid, TkW, DB, ExtraArg))\n", [Objtype]),
     p("  end;\n"),
-    gen_read_type_clauses(Objtypes,DB).
+    gen_read_type_clauses(Objtypes, DB).
 
-gen_readopt_case_clauses([]) ->
-    done;
-gen_readopt_case_clauses([{Opt,Fun}|OptFuncs]) ->
-    p("  ~p -> \n~p(Option,Gstkid,TkW,DB,ExtraArg);\n",[Opt,Fun]),
+gen_readopt_case_clauses([]) -> done;
+gen_readopt_case_clauses([{Opt, Fun}|OptFuncs]) ->
+    p("  ~p -> \n~p(Option, Gstkid, TkW, DB, ExtraArg);\n", [Opt, Fun]),
     gen_readopt_case_clauses(OptFuncs).
 
+p(Str) -> ok = io:format(get(stdout), Str, []).
 
-p(Str) ->
-    ok = io:format(get(stdout),Str,[]).
-
-p(Format,Data) ->
-    ok = io:format(get(stdout),Format,Data).
+p(Format, Data) -> ok = io:format(get(stdout), Format, Data).
 
 %%----------------------------------------------------------------------
 %% There items should be placed early in a case statement.
 %%----------------------------------------------------------------------
-obj_prio() -> [rectangle,line,gridline,image,button,canvas,checkbutton,radiobutton].
-opt_prio() -> [x,y,width,height,move,coords,data].
+obj_prio() -> [rectangle, line, gridline, image, button, canvas, checkbutton, radiobutton].
+opt_prio() -> [x, y, width, height, move, coords, data].
 
-merge_types(Types) ->
-    T2 = ordsets:from_list(Types),
-    P2 = ordsets:from_list(obj_prio()),
-    obj_prio() ++ ordsets:subtract(T2, P2).
+merge_types(Types) -> obj_prio() ++ ordsets:subtract(ordsets:from_list(Types), ordsets:from_list(obj_prio())).
 
-merge_opts([],L) -> L;
-merge_opts([Opt|Opts],Dict) ->
-    case gs:assq(Opt,Dict) of
-	{value,V} -> [{Opt,V}|merge_opts(Opts,lists:keydelete(Opt,1,Dict))];
-	false -> merge_opts(Opts,Dict)
+merge_opts([], L) -> L;
+merge_opts([Opt|Opts], Dict) ->
+    case gs:assq(Opt, Dict) of
+	{value, V} -> [{Opt, V}|merge_opts(Opts, lists:keydelete(Opt, 1, Dict))];
+	false -> merge_opts(Opts, Dict)
     end.
 
 the_config() ->
-    Buttons=[button,checkbutton,radiobutton],
-    AllPureTk = [Buttons,canvas,editor,entry,frame,label,listbox,
-                 menubar,menubutton,scale,window],
-    CanvasObj = [arc,image,line,oval,polygon,rectangle,text],
-    All = [AllPureTk,CanvasObj,grid,gridline,menu,menuitem,gs],
-    Containers = [canvas,frame,grid,menu,menubar,menubutton,menuitem,window],
-    Ob1 = [Buttons,canvas,grid,frame,label,entry,editor,listbox,scale],
-    Ob2 = [button,checkbutton,radiobutton,label,menubutton],
-    Ob3 = [Buttons,frame,label,entry,editor,listbox,scale,menubutton,
-	   menubar,menu],
-    Ob4 = [canvas,editor,listbox],
-    [{[Buttons,entry,scale,menubutton],enable,gen_enable,rw},
-     {[Buttons,label,entry,scale,menubutton,menu],fg,gen_fg,rw},
-     {[Buttons,label,entry,scale,menubutton,menu],bg,gen_bg,rw},
-     {Ob1,anchor,gen_anchor,rw},
-     {Ob1,height,gen_height,r},
-     {Ob1--[frame],height,gen_height,w},
-     {Ob1,width,gen_width,r},
-     {Ob1--[frame],width,gen_width,w},
-     {Ob1,pack_x,gen_pack_x,rw},
-     {Ob1,pack_y,gen_pack_y,rw},
-     {Ob1,pack_xy,gen_pack_xy,w},
-     {Ob1,x,gen_x,rw},
-     {Ob1,y,gen_y,rw},
-     {Ob1,raise,gen_raise,w},
-     {Ob1,lower,gen_lower,w},
-     {Ob2,align,gen_align,rw},
-     {Ob2,font,gen_font,rw},
-     {Ob2,justify,gen_justify,rw},
-     {Ob2,padx,gen_padx,rw},
-     {Ob2,pady,gen_pady,rw},
-     {Containers,default,gen_default,w},
-     {[AllPureTk,menu],relief,gen_relief,rw},
-     {[AllPureTk,menu],bw,gen_bw,rw},
-     {[Buttons,canvas,frame,label,entry,scale,menubutton,menu,menubar],
-      setfocus,gen_setfocus,rw},
-     {Ob3,buttonpress,gen_buttonpress,rw}, 
-     {Ob3,buttonrelease,gen_buttonrelease,rw},
-     {Ob3,configure,gen_configure,rw},
-     {[Ob3,window],destroy,gen_destroy,rw},
-     {[Ob3,window],enter,gen_enter,rw},
-     {[Ob3,window],leave,gen_leave,rw},
-     {[Ob3,window],focus,gen_focus_ev,rw},
-     {[Ob3,window],keypress,gen_keypress,rw},
-     {[Ob3,window],keyrelease,gen_keyrelease,rw},
-     {Ob3,motion,gen_motion,rw},
-     %% events containing x,y are special
-     {[window],buttonpress,gen_buttonpress,r},
-     {[window],buttonrelease,gen_buttonrelease,r},
-     {[window],motion,gen_motion,r},
-     {All,font_wh,gen_font_wh,r},
-     {All,choose_font,gen_choose_font,r},
-     {All,data,gen_data,rw},
-     {All,children,gen_children,r},
-     {All,id,gen_id,r},
-     {All,parent,gen_parent,r},
-     {All,type,gen_type,r},
-     {All,beep,gen_beep,w},
-     {All,keep_opt,gen_keep_opt,w},
-     {All,flush,gen_flush,rw},
-     {AllPureTk,highlightbw,gen_highlightbw,rw},
-     {AllPureTk,highlightbg,gen_highlightbg,rw},
-     {AllPureTk,highlightfg,gen_highlightfg,rw},
-     {AllPureTk,cursor,gen_cursor,rw}, % bug
-     {[Buttons,label,menubutton],label,gen_label,rw},
-     {[Buttons,menubutton,menu],activebg,gen_activebg,rw},
-     {[Buttons,menubutton,menu],activefg,gen_activefg,rw},
-     {[entry],selectbg,gen_selectbg,rw},
-     {[entry],selectbw,gen_selectbw,rw},
-     {[entry],selectfg,gen_selectfg,rw},
-     {Ob4,activebg,gen_so_activebg,rw},
-     {Ob4,bc,gen_so_bc,rw},
-     {Ob4,bg,gen_so_bg,rw},
-     {Ob4,hscroll,gen_so_hscroll,r},
-     {Ob4,scrollbg,gen_so_scrollbg,rw},
-     {Ob4,scrollfg,gen_so_scrollfg,rw},
-     {Ob4,scrolls,gen_so_scrolls,w},
-     {Ob4,selectbg,gen_so_selectbg,rw},
-     {Ob4,selectbg,gen_so_selectbg,rw},
-     {Ob4,selectbw,gen_so_selectbw,rw},
-     {Ob4,selectbw,gen_so_selectbw,rw},
-     {Ob4,selectfg,gen_so_selectfg,rw},
-     {Ob4,selectfg,gen_so_selectfg,rw},
-     {Ob4,vscroll,gen_so_vscroll,r},
-     {CanvasObj,coords,gen_citem_coords,rw},
-     {CanvasObj,lower,gen_citem_lower,w},
-     {CanvasObj,raise,gen_citem_raise,w},
-     {CanvasObj,move,gen_citem_move,w},
-     {CanvasObj,setfocus,gen_citem_setfocus,rw},
-     {CanvasObj,buttonpress,gen_citem_buttonpress,w}, % should be rw
-     {CanvasObj,buttonrelease,gen_citem_buttonrelease,w},
-     {CanvasObj,enter,gen_citem_enter,w},
-     {CanvasObj,focus,gen_citem_setfocus,w},
-     {CanvasObj,keypress,gen_citem_keypress,w},
-     {CanvasObj,keyrelease,gen_citem_keyrelease,w},
-     {CanvasObj,leave,gen_citem_leave,w},
-     {CanvasObj,motion,gen_citem_motion,w},
-     {CanvasObj,buttonpress,gen_buttonpress,r}, 
-     {CanvasObj,buttonrelease,gen_buttonrelease,r},
-     {CanvasObj,configure,gen_configure,r},
-     {CanvasObj,destroy,gen_destroy,r},
-     {CanvasObj,enter,gen_enter,r},
-     {CanvasObj,leave,gen_leave,r},
-     {CanvasObj,focus,gen_focus_ev,r},
-     {CanvasObj,keypress,gen_keypress,r},
-     {CanvasObj,keyrelease,gen_keyrelease,r},
-     {CanvasObj,motion,gen_motion,r},
-     {[arc,oval,polygon,rectangle],fill,gen_citem_fill,rw}].
-
+    Buttons= [button, checkbutton, radiobutton],
+    AllPureTk = [Buttons, canvas, editor, entry, frame, label, listbox, menubar, menubutton, scale, window],
+    CanvasObj = [arc, image, line, oval, polygon, rectangle, text],
+    All = [AllPureTk, CanvasObj, grid, gridline, menu, menuitem, gs],
+    Containers = [canvas, frame, grid, menu, menubar, menubutton, menuitem, window],
+    Ob1 = [Buttons, canvas, grid, frame, label, entry, editor, listbox, scale],
+    Ob2 = [button, checkbutton, radiobutton, label, menubutton],
+    Ob3 = [Buttons, frame, label, entry, editor, listbox, scale, menubutton, menubar, menu],
+    Ob4 = [canvas, editor, listbox],
+    [{[Buttons, entry, scale, menubutton], enable, gen_enable, rw},
+     {[Buttons, label, entry, scale, menubutton, menu], fg, gen_fg, rw},
+     {[Buttons, label, entry, scale, menubutton, menu], bg, gen_bg, rw},
+     {Ob1, anchor, gen_anchor, rw},
+     {Ob1, height, gen_height, r},
+     {lists:delete(frame, Ob1), height, gen_height, w},
+     {Ob1, width, gen_width, r},
+     {lists:delete(frame, Ob1), width, gen_width, w},
+     {Ob1, pack_x, gen_pack_x, rw},
+     {Ob1, pack_y, gen_pack_y, rw},
+     {Ob1, pack_xy, gen_pack_xy, w},
+     {Ob1, x, gen_x, rw},
+     {Ob1, y, gen_y, rw},
+     {Ob1, raise, gen_raise, w},
+     {Ob1, lower, gen_lower, w},
+     {Ob2, align, gen_align, rw},
+     {Ob2, font, gen_font, rw},
+     {Ob2, justify, gen_justify, rw},
+     {Ob2, padx, gen_padx, rw},
+     {Ob2, pady, gen_pady, rw},
+     {Containers, default, gen_default, w},
+     {[AllPureTk, menu], relief, gen_relief, rw},
+     {[AllPureTk, menu], bw, gen_bw, rw},
+     {[Buttons, canvas, frame, label, entry, scale, menubutton, menu, menubar], setfocus, gen_setfocus, rw},
+     {Ob3, buttonpress, gen_buttonpress, rw},
+     {Ob3, buttonrelease, gen_buttonrelease, rw},
+     {Ob3, configure, gen_configure, rw},
+     {[Ob3, window], destroy, gen_destroy, rw},
+     {[Ob3, window], enter, gen_enter, rw},
+     {[Ob3, window], leave, gen_leave, rw},
+     {[Ob3, window], focus, gen_focus_ev, rw},
+     {[Ob3, window], keypress, gen_keypress, rw},
+     {[Ob3, window], keyrelease, gen_keyrelease, rw},
+     {Ob3, motion, gen_motion, rw},
+     %% events containing x, y are special
+     {[window], buttonpress, gen_buttonpress, r},
+     {[window], buttonrelease, gen_buttonrelease, r},
+     {[window], motion, gen_motion, r},
+     {All, font_wh, gen_font_wh, r},
+     {All, choose_font, gen_choose_font, r},
+     {All, data, gen_data, rw},
+     {All, children, gen_children, r},
+     {All, id, gen_id, r},
+     {All, parent, gen_parent, r},
+     {All, type, gen_type, r},
+     {All, beep, gen_beep, w},
+     {All, keep_opt, gen_keep_opt, w},
+     {All, flush, gen_flush, rw},
+     {AllPureTk, highlightbw, gen_highlightbw, rw},
+     {AllPureTk, highlightbg, gen_highlightbg, rw},
+     {AllPureTk, highlightfg, gen_highlightfg, rw},
+     {AllPureTk, cursor, gen_cursor, rw}, % bug
+     {[Buttons, label, menubutton], label, gen_label, rw},
+     {[Buttons, menubutton, menu], activebg, gen_activebg, rw},
+     {[Buttons, menubutton, menu], activefg, gen_activefg, rw},
+     {[entry], selectbg, gen_selectbg, rw},
+     {[entry], selectbw, gen_selectbw, rw},
+     {[entry], selectfg, gen_selectfg, rw},
+     {Ob4, activebg, gen_so_activebg, rw},
+     {Ob4, bc, gen_so_bc, rw},
+     {Ob4, bg, gen_so_bg, rw},
+     {Ob4, hscroll, gen_so_hscroll, r},
+     {Ob4, scrollbg, gen_so_scrollbg, rw},
+     {Ob4, scrollfg, gen_so_scrollfg, rw},
+     {Ob4, scrolls, gen_so_scrolls, w},
+     {Ob4, selectbg, gen_so_selectbg, rw},
+     {Ob4, selectbg, gen_so_selectbg, rw},
+     {Ob4, selectbw, gen_so_selectbw, rw},
+     {Ob4, selectbw, gen_so_selectbw, rw},
+     {Ob4, selectfg, gen_so_selectfg, rw},
+     {Ob4, selectfg, gen_so_selectfg, rw},
+     {Ob4, vscroll, gen_so_vscroll, r},
+     {CanvasObj, coords, gen_citem_coords, rw},
+     {CanvasObj, lower, gen_citem_lower, w},
+     {CanvasObj, raise, gen_citem_raise, w},
+     {CanvasObj, move, gen_citem_move, w},
+     {CanvasObj, setfocus, gen_citem_setfocus, rw},
+     {CanvasObj, buttonpress, gen_citem_buttonpress, w}, % should be rw
+     {CanvasObj, buttonrelease, gen_citem_buttonrelease, w},
+     {CanvasObj, enter, gen_citem_enter, w},
+     {CanvasObj, focus, gen_citem_setfocus, w},
+     {CanvasObj, keypress, gen_citem_keypress, w},
+     {CanvasObj, keyrelease, gen_citem_keyrelease, w},
+     {CanvasObj, leave, gen_citem_leave, w},
+     {CanvasObj, motion, gen_citem_motion, w},
+     {CanvasObj, buttonpress, gen_buttonpress, r}, 
+     {CanvasObj, buttonrelease, gen_buttonrelease, r},
+     {CanvasObj, configure, gen_configure, r},
+     {CanvasObj, destroy, gen_destroy, r},
+     {CanvasObj, enter, gen_enter, r},
+     {CanvasObj, leave, gen_leave, r},
+     {CanvasObj, focus, gen_focus_ev, r},
+     {CanvasObj, keypress, gen_keypress, r},
+     {CanvasObj, keyrelease, gen_keyrelease, r},
+     {CanvasObj, motion, gen_motion, r},
+     {[arc, oval, polygon, rectangle], fill, gen_citem_fill, rw}].
diff -Ndurp otp_src_19.0.5/lib/gs/src/gs_packer.erl otp_src_19.0.5-lib-gs/lib/gs/src/gs_packer.erl
--- otp_src_19.0.5/lib/gs/src/gs_packer.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gs_packer.erl	2016-08-25 16:37:44.561693414 +0300
@@ -27,15 +27,14 @@
 -module(gs_packer).
 
 -export([pack/2]).
-%-compile(export_all).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%
 %%%%  This is a simple packer that take a specification in the format
-%%%%  
+%%%%
 %%%%    Spec       -> [WidthSpec, WidthSpec....]
-%%%%    WidthSpec  -> {fixed,Size} | {stretch,Weight} |
-%%%%                  {stretch,Weight,Min} | {stretch,Weight,Min,Max}
+%%%%    WidthSpec  -> {fixed, Size} | {stretch, Weight} |
+%%%%                  {stretch, Weight, Min} | {stretch, Weight, Min, Max}
 %%%%
 %%%%  and a given total size it produces a list of sizes of the
 %%%%  individual elements. Simple heuristics are used to make the code
@@ -76,30 +75,23 @@
 %%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-
-pack(Size, SpecSizes) when Size < 0 ->
-    pack(0, SpecSizes);
+pack(Size, SpecSizes) when Size < 0 -> pack(0, SpecSizes);
 pack(Size, SpecSizes) ->
-    {Weights,_Stretched,Fixed,Min,Max} = get_size_info(SpecSizes),
+    {Weights, _Stretched, Fixed, Min, Max} = get_size_info(SpecSizes),
     Left = Size - Fixed,
-    Unit = if Weights == 0 -> 0; true -> Left / Weights end,
+    Unit = if
+	       Weights == 0 -> 0;
+	       true -> Left / Weights
+	   end,
     if
-	Left < Min ->
-	    NewSpecs = cnvt_to_min(SpecSizes),
-	    pack(Size,NewSpecs);
-	is_integer(Max), Max =/= 0, Left > Max ->
-	    NewSpecs = cnvt_to_max(SpecSizes),
-	    pack(Size,NewSpecs);
-	true ->
-	    case remove_failure(SpecSizes, Unit) of
-		{no,NewSpecs} ->
-		    distribute_space(NewSpecs,Unit);
-		{yes,NewSpecs} ->
-		    pack(Size, NewSpecs)
-	    end
+	Left < Min -> pack(Size, cnvt_to_min(SpecSizes));
+	is_integer(Max), Max =/= 0, Left > Max -> pack(Size, cnvt_to_max(SpecSizes));
+	true -> case remove_failure(SpecSizes, Unit) of
+		    {no, NewSpecs} -> distribute_space(NewSpecs, Unit);
+		    {yes, NewSpecs} -> pack(Size, NewSpecs)
+		end
     end.
 
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%
 %%%%  remove_failure(Specs, Unit)
@@ -110,7 +102,7 @@ pack(Size, SpecSizes) ->
 %%%%
 %%%%  This is done with a simple heuristic. We pick the element that
 %%%%  has the largest diff from the required min or max, change this
-%%%%  {stretch,W,Mi,Ma} to a {fixed,Mi} or {fixed,Ma} and redo the
+%%%%  {stretch, W,Mi, Ma} to a {fixed, Mi} or {fixed, Ma} and redo the
 %%%%  whole process again.
 %%%%
 %%%%  **** BUGS ****
@@ -121,49 +113,38 @@ pack(Size, SpecSizes) ->
 
 remove_failure(Specs, Unit) ->
     case remove_failure(Specs, Unit, 0) of
-	{done,NewSpecs} ->
-	    {yes,NewSpecs};
-	{_,_NewSpecs} ->
-	    {no,Specs}				% NewSpecs == Specs but
-    end.					% we choose the old one
+	{done, NewSpecs} -> {yes, NewSpecs};
+	{_, _NewSpecs} -> {no, Specs}	% NewSpecs == Specs but we choose the old one
+    end.
 
-remove_failure([], _Unit, MaxFailure) ->
-    {MaxFailure,[]};
-remove_failure([{stretch,W,Mi} | Specs], Unit, MaxFailure) ->
-    {MinMax,NewMaxFailure} = max_failure(MaxFailure, Mi-W*Unit, 0),
-    case {MinMax,remove_failure(Specs, Unit, NewMaxFailure)} of
-	{min,{NewMaxFailure,Rest}} ->
-	    {done,[{fixed,Mi} | Rest]};
-	{_,{OtherMaxFailure, Rest}} ->
-	    {OtherMaxFailure,[{stretch,W,Mi} | Rest]}
+remove_failure([], _Unit, MaxFailure) -> {MaxFailure, []};
+remove_failure([{stretch, W, Mi}|Specs], Unit, MaxFailure) ->
+    {MinMax, NewMaxFailure} = max_failure(MaxFailure, Mi - W * Unit, 0),
+    case {MinMax, remove_failure(Specs, Unit, NewMaxFailure)} of
+	{min, {NewMaxFailure, Rest}} -> {done, [{fixed, Mi}|Rest]};
+	{_, {OtherMaxFailure, Rest}} -> {OtherMaxFailure, [{stretch, W, Mi}|Rest]}
     end;
-remove_failure([{stretch,W,Mi,Ma} | Specs], Unit, MaxFailure) ->
-    {MinMax,NewMaxFailure} = max_failure(MaxFailure, Mi-W*Unit, W*Unit-Ma),
-    case {MinMax,remove_failure(Specs, Unit, NewMaxFailure)} of
-	{min,{NewMaxFailure,Rest}} ->
-	    {done,[{fixed,Mi} | Rest]};
-	{max,{NewMaxFailure,Rest}} ->
-	    {done,[{fixed,Ma} | Rest]};
-	{_,{OtherMaxFailure, Rest}} ->
-	    {OtherMaxFailure,[{stretch,W,Mi,Ma} | Rest]}
+remove_failure([{stretch, W, Mi, Ma}|Specs], Unit, MaxFailure) ->
+    {MinMax, NewMaxFailure} = max_failure(MaxFailure, Mi - W * Unit, W * Unit - Ma),
+    case {MinMax, remove_failure(Specs, Unit, NewMaxFailure)} of
+	{min, {NewMaxFailure, Rest}} -> {done, [{fixed, Mi}|Rest]};
+	{max, {NewMaxFailure, Rest}} -> {done, [{fixed, Ma}|Rest]};
+	{_, {OtherMaxFailure, Rest}} -> {OtherMaxFailure, [{stretch, W, Mi, Ma}|Rest]}
     end;
-remove_failure([Spec | Specs], Unit, MaxFailure) ->
-    {NewMaxFailure,NewSpecs} = remove_failure(Specs, Unit, MaxFailure),
-    {NewMaxFailure, [Spec | NewSpecs]}.
-
-max_failure(LastDiff, DMi, DMa)
-  when DMi > LastDiff, DMi > DMa ->
-    {min,DMi};
-max_failure(LastDiff, _DMi, DMa)
-  when DMa > LastDiff ->
-    {max,DMa};
-max_failure(MaxFailure, _DMi, _DMa) ->
-    {other,MaxFailure}.
+remove_failure([Spec|Specs], Unit, MaxFailure) ->
+    {NewMaxFailure, NewSpecs} = remove_failure(Specs, Unit, MaxFailure),
+    {NewMaxFailure, [Spec|NewSpecs]}.
 
+max_failure(LastDiff, DMi, DMa) when DMi > LastDiff ->
+    if
+	DMi > DMa -> {min, DMi};
+	true -> {max, DMa}
+    end;
+max_failure(MaxFailure, _DMi, _DMa) -> {other, MaxFailure}.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%
-%%%%  distribute_space(Spec,Unit)
+%%%%  distribute_space(Spec, Unit)
 %%%%
 %%%%  We now know that we can distribute the space to the elements in
 %%%%  the list.
@@ -179,27 +160,23 @@ max_failure(MaxFailure, _DMi, _DMa) ->
 %%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
+distribute_space(Specs, Unit) -> distribute_space(Specs, Unit, 0.0).
 
-distribute_space(Specs, Unit) ->
-    distribute_space(Specs, Unit, 0.0).
-
-distribute_space([], _Unit, _Err) ->
-    [];
-distribute_space([Spec | Specs], Unit, Err) ->
-    distribute_space(Spec, Specs, Unit, Err).
+distribute_space([], _Unit, _Err) -> [];
+distribute_space([Spec|Specs], Unit, Err) -> distribute_space(Spec, Specs, Unit, Err).
 
-distribute_space({fixed,P}, Specs, Unit, Err) ->
-    [P | distribute_space(Specs, Unit, Err)];
-distribute_space({stretch,Weight}, Specs, Unit, Err) ->
+distribute_space({fixed, P}, Specs, Unit, Err) ->
+    [P|distribute_space(Specs, Unit, Err)];
+distribute_space({stretch, Weight}, Specs, Unit, Err) ->
     Size = Weight * Unit + Err,
     Pixels = round(Size),
-    NewErr = Size - Pixels,
-    [Pixels | distribute_space(Specs, Unit, NewErr)];
-distribute_space({stretch,W,_Mi}, Specs, Unit, Err) ->
-    distribute_space({stretch,W}, Specs, Unit, Err);
-distribute_space({stretch,W,_Mi,_Ma}, Specs, Unit, Err) ->
-    distribute_space({stretch,W}, Specs, Unit, Err).
-    
+    distribute_space({fixed, Pixels}, Specs, Unit, Size - Pixels);
+distribute_space(Arg, Specs, Unit, Err) ->
+    distribute_space({stretch, case Arg of
+				   {stretch, W, _Mi} -> W;
+				   {stretch, W, _Mi, _Ma} -> W
+			       end},
+		      Specs, Unit, Err).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%
@@ -221,34 +198,28 @@ distribute_space({stretch,W,_Mi,_Ma}, Sp
 %%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
+cnvt_to_min([]) -> [];
+cnvt_to_min([Spec|Specs]) -> cnvt_to_min(Spec, Specs).
 
-cnvt_to_min([]) ->
-    [];
-cnvt_to_min([Spec | Specs]) ->
-    cnvt_to_min(Spec, Specs).
-
-cnvt_to_max([]) ->
-    [];
-cnvt_to_max([Spec | Specs]) ->
-    cnvt_to_max(Spec, Specs).
+cnvt_to_max([]) -> [];
+cnvt_to_max([Spec|Specs]) -> cnvt_to_max(Spec, Specs).
 
-cnvt_to_min({fixed,P}, Specs) ->
-    [{stretch,P} | cnvt_to_min(Specs)];
-cnvt_to_min({stretch,_W}, Specs) ->
-    [{fixed,0} | cnvt_to_min(Specs)];
-cnvt_to_min({stretch,_W,Mi}, Specs) ->
-    [{stretch,Mi} | cnvt_to_min(Specs)];
-cnvt_to_min({stretch,_W,Mi,_Ma}, Specs) ->
-    [{stretch,Mi} | cnvt_to_min(Specs)].
+cnvt_to_min({stretch, _W}, Specs) -> cnvt_to_min({fixed, 0}, Specs);
+cnvt_to_min(Arg, Specs) ->
+    [{stretch, case Arg of
+		   {fixed, P} -> P;
+		   {stretch, _W, Mi} -> Mi;
+		   {stretch, _W, Mi, _Ma} -> Mi
+	       end}|cnvt_to_min(Specs)].
 
-%% We know that there can only be {fixed,P} and {stretch,W,Mi,Ma}
+%% We know that there can only be {fixed, P} and {stretch, W,Mi, Ma}
 %% in this list.
 
-cnvt_to_max({fixed,P}, Specs) ->
-    [{stretch,P} | cnvt_to_max(Specs)];
-cnvt_to_max({stretch,_W,_Mi,Ma}, Specs) ->
-    [{stretch,Ma} | cnvt_to_max(Specs)].
-
+cnvt_to_max(Arg, Specs) ->
+    [{stretch, case Arg of
+		   {fixed, P} -> P;
+		   {stretch, _W, _Mi, Ma} -> Ma
+	       end}|cnvt_to_max(Specs)].
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%
@@ -256,21 +227,21 @@ cnvt_to_max({stretch,_W,_Mi,Ma}, Specs)
 %%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-get_size_info(Specs) ->
-    get_size_info(Specs, 0, 0, 0, 0, 0).
+get_size_info(Specs) -> get_size_info(Specs, 0, 0, 0, 0, 0).
 
 get_size_info([], TotW, NumW, TotFixed, TotMin, TotMax) ->
     {TotW, NumW, TotFixed, TotMin, TotMax};
-get_size_info([Spec | Specs], TotW, NumW, TotFixed, TotMin, TotMax) ->
+get_size_info([Spec|Specs], TotW, NumW, TotFixed, TotMin, TotMax) ->
     get_size_info(Spec, TotW, NumW, TotFixed, TotMin, TotMax, Specs).
-    
-get_size_info({fixed,P}, TotW, NumW, TotFixed, TotMin, TotMax, Specs) ->
-    get_size_info(Specs, TotW, NumW, TotFixed+P, TotMin, TotMax);
-get_size_info({stretch,W}, TotW, NumW, TotFixed, TotMin, _TotMax, Specs) ->
-    get_size_info(Specs, TotW+W, NumW+1, TotFixed, TotMin, infinity);
-get_size_info({stretch,W,Mi}, TotW, NumW, TotFixed, TotMin, _TotMax, Specs) ->
-    get_size_info(Specs, TotW+W, NumW+1, TotFixed, TotMin+Mi, infinity);
-get_size_info({stretch,W,Mi,_Ma}, TotW, NumW, TotFixed, TotMin, infinity, Specs) ->
-    get_size_info(Specs, TotW+W, NumW+1, TotFixed, TotMin+Mi, infinity);
-get_size_info({stretch,W,Mi,Ma}, TotW, NumW, TotFixed, TotMin, TotMax, Specs) ->
-    get_size_info(Specs, TotW+W, NumW+1, TotFixed, TotMin+Mi, TotMax+Ma).
+
+get_size_info({fixed, P}, TotW, NumW, TotFixed, TotMin, TotMax, Specs) ->
+    get_size_info(Specs, TotW, NumW, TotFixed + P, TotMin, TotMax);
+get_size_info({stretch, W}, TotW, NumW, TotFixed, TotMin, _TotMax, Specs) ->
+    get_size_info(Specs, TotW + W, NumW + 1, TotFixed, TotMin, infinity);
+get_size_info({stretch, W, Mi}, TotW, NumW, TotFixed, TotMin, _TotMax, Specs) ->
+    get_size_info(Specs, TotW + W, NumW + 1, TotFixed, TotMin + Mi, infinity);
+get_size_info({stretch, W, Mi, Ma}, TotW, NumW, TotFixed, TotMin, TotMax, Specs) ->
+    get_size_info(Specs, TotW + W, NumW + 1, TotFixed, TotMin + Mi, if
+									TotMax =:= infinity -> infinity;
+									true -> TotMax + Ma
+								    end).
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_arc.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_arc.erl
--- otp_src_19.0.5/lib/gs/src/gstk_arc.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_arc.erl	2016-08-25 16:37:44.561693414 +0300
@@ -24,14 +24,15 @@
 %% ------------------------------------------------------------
 
 -module(gstk_arc).
--compile([{nowarn_deprecated_function,{gs,creation_error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, creation_error, 2}}]).
 
 %%-----------------------------------------------------------------------------
 %% 			    ARC OPTIONS
 %%
 %%  Attributes:
 %%	bw			Int
-%%	coords			[{X1,Y1}, {X2,Y2}]
+%%	coords			[{X1, Y1}, {X2, Y2}]
 %%	data			Data
 %%	extent			Degrees
 %%	fg			Color
@@ -63,8 +64,7 @@
 %%	type
 %%
 
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
-	 option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -84,18 +84,14 @@
 %%
 %% Return 	: [Gsid_of_new_widget | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-create(DB, GstkId, Opts) ->
-    case gstk_canvas:pickout_coords(Opts, [],GstkId#gstkid.objtype,2) of
-	{error, Error} ->
-	    gs:creation_error(GstkId,Error);
+create(DB, #gstkid{objtype = ObjType} = GstkId, Opts) ->
+    case gstk_canvas:pickout_coords(Opts, [], ObjType, 2) of
+	{error, Error} -> gs:creation_error(GstkId, Error);
 	{Coords, NewOpts} ->
-	    Ngstkid=gstk_canvas:upd_gstkid(DB, GstkId, Opts),
-	    #gstkid{widget=CanvasTkW}=Ngstkid,
-	    MCmd = [CanvasTkW, " create ar ", Coords],
-	    gstk_canvas:mk_cmd_and_call(NewOpts,Ngstkid,CanvasTkW,MCmd,DB)
+	    #gstkid{widget = CanvasTkW} = Ngstkid = gstk_canvas:upd_gstkid(DB, GstkId, Opts),
+	    gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create ar ", Coords], DB)
     end.
 
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
 %% Purpose    	: Configure a widget of the type defined in this module.
@@ -105,8 +101,7 @@ create(DB, GstkId, Opts) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    gstk_canvas:item_config(DB, Gstkid, Opts).
+config(DB, Gstkid, Opts) -> gstk_canvas:item_config(DB, Gstkid, Opts).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -117,9 +112,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    Item = Gstkid#gstkid.widget_data,
-    gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
+read(DB, #gstkid{widget_data = Item} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -130,9 +123,7 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy | {Parent, Objmod, Args}.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
-    gstk_canvas:item_delete_impl(DB,Gstkid).
-
+delete(DB, Gstkid) -> gstk_canvas:item_delete_impl(DB, Gstkid).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: destroy/3
@@ -143,12 +134,9 @@ delete(DB, Gstkid) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
-    gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
 
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%------------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -160,16 +148,18 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%		  Canvas  - The canvas tk-widget
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, _Gstkid, _Canvas, _DB, _AItem) ->
-    case Option of
-	{bw,            Int} -> {s, [" -w ", gstk:to_ascii(Int)]};
-	{extent,    Degrees} -> {s, [" -e ", gstk:to_ascii(Degrees)]};
-	{fg,          Color} -> {s, [" -outline ", gstk:to_color(Color)]};
-	{start,     Degrees} -> {s, [" -start ", gstk:to_ascii(Degrees)]};
-	{style,       Style} -> {s, [" -sty ", gstk:to_ascii(Style)]};
-	_ -> invalid_option
-    end.
+option(Option, _Gstkid, _Canvas, _DB, _AItem) -> option(Option).
 
+option({fg, Color}) -> option_s([" -outline ", gstk:to_color(Color)]);
+option({bw, Int}) -> to_ascii(" -w ", Int);
+option({extent, Degrees}) -> to_ascii(" -e ", Degrees);
+option({start, Degrees}) -> to_ascii(" -start ", Degrees);
+option({style, Style}) -> to_ascii(" -sty ", Style);
+option(_Option) -> invalid_option.
+
+option_s(L) -> {s, L}.
+
+to_ascii(Str, Val) -> option_s([Str, gstk:to_ascii(Val)]).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
@@ -178,15 +168,19 @@ option(Option, _Gstkid, _Canvas, _DB, _A
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 read_option(Option, Gstkid, Canvas, _DB, AItem) ->
-    case Option of
-	bw       -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
-	extent   -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -e"]);
-	fg       -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -outline"]);
-	start    -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -start"]);
-	stipple  -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -sti"]);
-	style    -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, " -sty"]);
-
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+    case read_option(Option, AItem, Canvas) of
+	invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+	O -> O
     end.
 
+read_option(fg, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -outline"]);
+read_option(stipple, AItem, Canvas) -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -sti"]);
+read_option(style, AItem, Canvas) -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, " -sty"]);
+read_option(bw, AItem, Canvas) -> ret_int(" -w", AItem, Canvas);
+read_option(extent, AItem, Canvas) -> ret_int(" -e", AItem, Canvas);
+read_option(start, AItem, Canvas) -> ret_int(" -start", AItem, Canvas);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
+
+ret_int(Str, AItem, Canvas) -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, Str]).
+
 %% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_button.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_button.erl
--- otp_src_19.0.5/lib/gs/src/gstk_button.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_button.erl	2016-08-25 16:37:44.561693414 +0300
@@ -31,8 +31,8 @@
 %%  Attributes:
 %%	activebg		Color
 %%	activefg		Color
-%%	align			n,w,s,e,nw,se,ne,sw,center
-%%	anchor			n,w,s,e,nw,se,ne,sw,center
+%%	align			n, w,s, e,nw, se, ne, sw, center
+%%	anchor			n, w,s, e,nw, se, ne, sw, center
 %%	bg			Color
 %%	bw			Int
 %%	data			Data
@@ -84,7 +84,7 @@
 %%	font			??????
 %%
 
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -97,13 +97,12 @@
 %% Return 	: [Gsid_of_new_widget | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, GstkId, Opts) ->
-    TkW = gstk_generic:mk_tkw_child(DB,GstkId),
-    NGstkId=GstkId#gstkid{widget=TkW},
-    PlacePreCmd = [";place ", TkW],
-    case gstk_generic:make_command(Opts,NGstkId,TkW,"",PlacePreCmd,DB) of
-	{error,Reason} -> {error,Reason};
+    TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+    NGstkId = GstkId#gstkid{widget = TkW},
+    case gstk_generic:make_command(Opts, NGstkId, TkW, "", [";place ", TkW], DB) of
+	{error, _Reason} = E -> E;
 	Cmd when is_list(Cmd) ->
-	    gstk:exec(["button ", TkW," -rel raised -bo 2 ",Cmd]),
+	    gstk:exec(["button ", TkW, " -rel raised -bo 2 ", Cmd]),
 	    NGstkId
     end.
 
@@ -116,10 +115,7 @@ create(DB, GstkId, Opts) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    TkW = Gstkid#gstkid.widget,
-    SimplePreCmd = [TkW, " conf"],
-    gstk_generic:mk_cmd_and_exec(Opts,Gstkid,SimplePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) -> gstk_generic:mk_cmd_and_exec(Opts, Gstkid, [TkW, " conf"], DB).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -130,8 +126,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    gstk_generic:read_option(DB, Gstkid, Opt).
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -142,12 +137,11 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    Gstkid#gstkid.widget.
+    TkW.
 
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%------------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -162,17 +156,30 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
-    case Option of
-	{bitmap,     Bitmap} -> {s, [" -bi @", Bitmap]};
-	{disabledfg,  Color} -> {s, [" -disabledf ", gstk:to_color(Color)]};
-	{underline,     Int} -> {s, [" -un ", gstk:to_ascii(Int)]};
-	{wraplength,    Int} -> {s, [" -wr ", gstk:to_ascii(Int)]};
-	invoke               -> {c, [TkW, " i;"]};
-	flash                -> {c, [TkW, " f;"]};
-	{click,          On} -> cbind(DB, Gstkid, click, On);
-	_                    -> invalid_option
-    end.
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
+
+option({click, On}, Gstkid, _TkW, DB) -> cbind(DB, Gstkid, click, On);
+option(Option, _Gstkid, TkW, _DB) -> option(Option, TkW).
+
+option(invoke, TkW) -> option_c(" i;", TkW);
+option(flash, TkW) -> option_c(" f;", TkW);
+option(Option, _TkW) -> option(Option).
+
+option({bitmap, Bitmap}) -> option_s(" -bi @", Bitmap);
+option({disabledfg, Color}) -> option_s(" -disabledf ", gstk:to_color(Color));
+option({underline, Int}) -> to_ascii(" -un ", Int);
+option({wraplength, Int}) -> to_ascii(" -wr ", Int);
+option(_Option) -> invalid_option.
+
+option_c(L) -> {c, L}.
+
+option_c(Str, TkW) -> option_c([TkW, Str]).
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
+
+to_ascii(Str, Int) -> option_s(Str, gstk:to_ascii(Int)).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/4
@@ -184,17 +191,24 @@ option(Option, Gstkid, TkW, DB,_) ->
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid, TkW,DB,_) -> 
-    case Option of
-	disabledfg    -> tcl2erl:ret_color([TkW, " cg -disabledf"]);
-	underline     -> tcl2erl:ret_int([TkW, " cg -un"]);
-	wraplength    -> tcl2erl:ret_int([TkW, " cg -wr"]);
+read_option(Option, Gstkid, TkW, DB, _) -> read_option(Option, Gstkid, TkW, DB).
 
-	click         -> gstk_db:is_inserted(DB, Gstkid, click);
+read_option(click, Gstkid, _TkW, DB) -> gstk_db:is_inserted(DB, Gstkid, click);
+read_option(Option, Gstkid, TkW, _DB) -> read_option(Option, Gstkid, TkW).
 
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(Option, Gstkid, TkW) ->
+    case read_option(Option, TkW) of
+	invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+	O -> O
     end.
 
+read_option(disabledfg, TkW) -> tcl2erl:ret_color([TkW, " cg -disabledf"]);
+read_option(underline, TkW) -> ret_int(" cg -un", TkW);
+read_option(wraplength, TkW) -> ret_int(" cg -wr", TkW);
+read_option(_Option, _TkW) -> invalid_option.
+
+ret_int(Str, TkW) -> tcl2erl:ret_int([TkW, Str]).
+
 %%------------------------------------------------------------------------------
 %%			       PRIMITIVES
 %%------------------------------------------------------------------------------
@@ -202,20 +216,11 @@ read_option(Option,Gstkid, TkW,DB,_) ->
 %%
 %% Config bind
 %%
-cbind(DB, Gstkid, Etype, On) ->
-    TkW = Gstkid#gstkid.widget,
-    Cmd = case On of
-	      {true, Edata} ->
-		  Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
-		  [" -command {erlsend ", Eref, " \\\"[", TkW, " cg -text]\\\"}"];
-	      true ->
-		  Eref = gstk_db:insert_event(DB, Gstkid, Etype, ""),
-		  [" -command {erlsend ", Eref, " \\\"[", TkW, " cg -text]\\\"}"];
-	      _Other ->
-		  gstk_db:delete_event(DB, Gstkid, Etype),
-		  " -command {}"
-	  end,
-    {s, Cmd}.
+cbind(DB, Gstkid, Etype, true) -> cbind(DB, Gstkid, Etype, {true, ""});
+cbind(DB, #gstkid{widget = TkW} = Gstkid, Etype, {true, Edata}) ->
+    option_s([" -command {erlsend ", gstk_db:insert_event(DB, Gstkid, Etype, Edata), " \\\"[", TkW, " cg -text]\\\"}"]);
+cbind(DB, Gstkid, Etype, _On) ->
+    gstk_db:delete_event(DB, Gstkid, Etype),
+    option_s(" -command {}").
 
 %% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_canvas.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_canvas.erl
--- otp_src_19.0.5/lib/gs/src/gstk_canvas.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_canvas.erl	2016-08-25 16:37:44.562693392 +0300
@@ -24,15 +24,15 @@
 %% ------------------------------------------------------------
 
 -module(gstk_canvas).
--compile([{nowarn_deprecated_function,{gs,pair,2}},
-          {nowarn_deprecated_function,{gs,val,2}}]).
+-compile([{nowarn_deprecated_function, {gs, pair, 2}},
+          {nowarn_deprecated_function, {gs, val, 2}}]).
 
 %%-----------------------------------------------------------------------------
 %% 			    CANVAS OPTIONS
 %%
 %%  Attributes:
 %%	activebg		Color
-%%	anchor			n,w,s,e,nw,se,ne,sw,center
+%%	anchor			n, w,s, e,nw, se, ne, sw, center
 %%	bc			Color
 %%	bg			Color
 %%	bw			Wth
@@ -56,7 +56,7 @@
 %%
 %%
 %%  Commands:
-%%	find			{X, Y}	 =>    Item at pos X,Y or false
+%%	find			{X, Y}	 =>    Item at pos X, Y or false
 %%	setfocus		Bool
 %%
 %%  Events:
@@ -81,10 +81,16 @@
 %%	fg			Color
 %%
 
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5]).
--export([make_command/5,make_command/6,pickout_coords/4, coords/1,
-	item_config/3,mk_create_opts_for_child/4,
-	upd_gstkid/3,item_delete_impl/2,mk_cmd_and_exec/6,mk_cmd_and_call/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
+-export([make_command/5, make_command/6,
+	 pickout_coords/4,
+	 coords/1,
+	 item_config/3, 
+	 mk_create_opts_for_child/4,
+	 upd_gstkid/3,
+	 item_delete_impl/2,
+	 mk_cmd_and_exec/6,
+	 mk_cmd_and_call/5]).
 
 -include("gstk.hrl").
 
@@ -96,33 +102,26 @@
 %% Return 	: [Gsid_of_new_widget | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, Gstkid, Opts) ->
-    MainW = gstk_generic:mk_tkw_child(DB,Gstkid),
-    Canvas = lists:append(MainW,".z"),
+    MainW = gstk_generic:mk_tkw_child(DB, Gstkid),
+    Canvas = lists:append(MainW, ".z"),
     {Vscroll, Hscroll, NewOpts} = gstk_generic:parse_scrolls(Opts),
-    WidgetD = #so{main=MainW, object=Canvas,
-		  hscroll=Hscroll, vscroll=Vscroll},
-    NGstkid=Gstkid#gstkid{widget=MainW, widget_data=WidgetD},
-    MandatoryCmd = ["so_create canvas ", MainW],
-    case gstk:call(MandatoryCmd) of
+    NGstkid = Gstkid#gstkid{widget = MainW,
+			    widget_data = #so{main = MainW, object = Canvas, hscroll = Hscroll, vscroll = Vscroll}},
+    case gstk:call(NGstkid) of
 	{result, _} ->
-	    SimplePreCmd = [MainW, " conf"],
-	    PlacePreCmd = [";place ", MainW],
-	    gstk_db:insert_opt(DB,Gstkid,gs:pair(scrollregion,Opts)),
-	    case gstk_generic:make_command(NewOpts, NGstkid, MainW,
-			       SimplePreCmd, PlacePreCmd, DB,Canvas) of
-		{error,Reason} -> {error,Reason};
+	    gstk_db:insert_opt(DB, Gstkid, gs:pair(scrollregion, Opts)),
+	    case gstk_generic:make_command(NewOpts, NGstkid, MainW, [MainW, " conf"], [";place ", MainW], DB, Canvas) of
+		{error, _Reason} = E -> E;
 		Cmd when is_list(Cmd) ->
 		    gstk:exec(Cmd),
-		    gstk:exec([MainW,".sy conf -rel sunken -bo 2;",
-			      MainW,".pad.sx conf -rel sunken -bo 2;"]),
+		    gstk:exec([MainW, ".sy conf -rel sunken -bo 2;", MainW, ".pad.sx conf -rel sunken -bo 2;"]),
 		    NGstkid
 	    end;
-	Bad_Result ->
-	    {bad_result, Bad_Result}
+	Bad_Result -> {bad_result, Bad_Result}
     end.
 
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
-    gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+    gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
@@ -133,15 +132,9 @@ mk_create_opts_for_child(DB,Cgstkid, Pgs
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Options) ->
-    SO = Gstkid#gstkid.widget_data,
-    MainW = Gstkid#gstkid.widget,
-    Canvas = SO#so.object,
-    NewOpts = gstk_generic:parse_scrolls(Gstkid, Options),
-    SimplePreCmd = [MainW, " conf"],
-    PlacePreCmd = [";place ", MainW],
-    gstk_generic:mk_cmd_and_exec(NewOpts, Gstkid, MainW,
-				SimplePreCmd, PlacePreCmd, DB,Canvas).
+config(DB, #gstkid{widget_data = #so{object = O}, widget = MainW} = Gstkid, Options) ->
+    gstk_generic:mk_cmd_and_exec(gstk_generic:parse_scrolls(Gstkid, Options),
+				 Gstkid, MainW, [MainW, " conf"], [";place ", MainW], DB, O).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -152,10 +145,7 @@ config(DB, Gstkid, Options) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    SO = Gstkid#gstkid.widget_data,
-    gstk_generic:read_option(DB, Gstkid, Opt,SO#so.object).
-
+read(DB, #gstkid{widget_data = #so{object = O}} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, O).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -165,13 +155,11 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = W} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    Gstkid#gstkid.widget.
-
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+    W.
 
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%-----------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -187,50 +175,37 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option,Gstkid,_MainW,DB,Canvas) ->
-    case Option of
-	{scrollregion, {X1, Y1, X2, Y2}} ->
-	    gstk_db:insert_opt(DB,Gstkid,Option),
-    	    {c, [Canvas, " conf -scrollr {",
-		 gstk:to_ascii(X1), " ", gstk:to_ascii(Y1), " ",
-		 gstk:to_ascii(X2), " ", gstk:to_ascii(Y2),"}"]};
-	{yscrollpos, Y} ->
-	    {_,Ymin,_,Ymax} = gstk_db:opt(DB,Gstkid,scrollregion),
-	    K = 1/(Ymax-Ymin),
-	    M = -K*Ymin,
-	    PercentOffViewTop = K*Y+M,
-	    {c, [Canvas," yvi mo ",gstk:to_ascii(PercentOffViewTop)]};
-	{xscrollpos, X} ->
-	    {Xmin,_,Xmax,_} = gstk_db:opt(DB,Gstkid,scrollregion),
-	    K = 1/(Xmax-Xmin),
-	    M = -K*Xmin,
-	    PercentOffViewLeft = K*X+M,
-	    {c, [Canvas," xvi mo ",gstk:to_ascii(PercentOffViewLeft)]};
-	{buttonpress,    On} -> bind(DB, Gstkid, Canvas, buttonpress, On);
-	{buttonrelease,  On} -> bind(DB, Gstkid, Canvas, buttonrelease, On);
-	{configure,      On} -> bind(DB, Gstkid, Canvas, configure, On);
-	{destroy,        On} -> bind(DB, Gstkid, Canvas, destroy, On);
-	{enter,          On} -> bind(DB, Gstkid, Canvas, enter, On);
-	{focus,          On} -> bind(DB, Gstkid, Canvas, focus, On);
-	{keypress,       On} -> bind(DB, Gstkid, Canvas, keypress, On);
-	{keyrelease,     On} -> bind(DB, Gstkid, Canvas, keyrelease, On);
-	{leave,          On} -> bind(DB, Gstkid, Canvas, leave, On);
-	{motion,         On} -> bind(DB, Gstkid, Canvas, motion, On);
+option(Option, Gstkid, _MainW, DB, Canvas) -> option(Option, Gstkid, Canvas, DB).
 
-	{secret_hack_gridit, GridGstkid} ->
-	    CRef = gstk_db:insert_event(DB, GridGstkid, click, []),
-	    ClickCmd = [Canvas, " bind all <ButtonRelease-1> {erlsend ", CRef, 
-			" [",Canvas, " find withtag current]};"],
-	    DRef = gstk_db:insert_event(DB, GridGstkid, doubleclick, []),
-	    DclickCmd = [Canvas," bind all <Double-ButtonRelease-1> {erlsend ",
-			 DRef," [",Canvas, " find withtag current]}"],
-	    %% bind all at once for preformance reasons.
-	    {c, [ClickCmd,DclickCmd]};
-	{secret_forwarded_grid_event, {Event,On},GridGstkid} ->
-	    bind(DB,GridGstkid,Canvas,Event,On);
-	_ -> invalid_option
-    end.
+option({scrollregion, {X1, Y1, X2, Y2}} = Option, Gstkid, Canvas, DB) ->
+    gstk_db:insert_opt(DB, Gstkid, Option),
+    option_c([Canvas, " conf -scrollr {",
+	      gstk:to_ascii(X1), " ", gstk:to_ascii(Y1), " ", gstk:to_ascii(X2), " ", gstk:to_ascii(Y2), "}"]);
+option({xscrollpos, X}, Gstkid, Canvas, DB) ->
+    {Xmin, _, Xmax, _} = gstk_db:opt(DB, Gstkid, scrollregion),
+    option_c([Canvas, " xvi mo ", gstk:to_ascii(1 / (Xmax - Xmin) * (X - Xmin))]);
+option({yscrollpos, Y}, Gstkid, Canvas, DB) ->
+    {_, Ymin, _, Ymax} = gstk_db:opt(DB, Gstkid, scrollregion),
+    option_c([Canvas, " yvi mo ", gstk:to_ascii(1 / (Ymax - Ymin) * (Y - Ymin))]);
+option({secret_hack_gridit, GridGstkid}, _Gstkid, Canvas, DB) ->
+    %% bind all at once for preformance reasons.
+    option_c([[Canvas, " bind all <ButtonRelease-1> {erlsend ",
+	       gstk_db:insert_event(DB, GridGstkid, click, []), " [", Canvas, " find withtag current]};"],
+	      [Canvas, " bind all <Double-ButtonRelease-1> {erlsend ",
+	       gstk_db:insert_event(DB, GridGstkid, doubleclick, []), " [", Canvas, " find withtag current]}"]]);
+option({secret_forwarded_grid_event, {Event, On}, GridGstkid}, _Gstkid, Canvas, DB) ->
+    bind(DB, GridGstkid, Canvas, Event, On);
+option({O, On}, Gstkid, Canvas, DB) when O =:= buttonpress; O =:= buttonrelease; O =:= motion;
+					 O =:= configure;
+					 O =:= destroy;
+					 O =:= enter;
+					 O =:= focus; O =:= leave;
+					 O =:= keypress; O =:= keyrelease ->
+    bind(DB, Gstkid, Canvas, O, On);
 
+option(_Option, _Gstkid, _Canvas, _DB) -> invalid_option.
+
+option_c(L) -> {c, L}.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
@@ -238,57 +213,44 @@ option(Option,Gstkid,_MainW,DB,Canvas) -
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid,_MainW,DB,Canvas) ->
-    case Option of
-	scrollregion  -> gstk_db:opt(DB,Gstkid,scrollregion);
-	{hit, {X,Y}} ->
-	    hit(DB,Canvas,X,Y,X,Y);
-	{hit, [{X1,Y1},{X2,Y2}]} ->
-	    hit(DB,Canvas,X1,Y1,X2,Y2);
-	% {% hidden above, % of total area that is visible + % hidden above}
-	yscrollpos ->
-	    {PercentOffViewTop,_} = tcl2erl:ret_tuple([Canvas," yvi"]),
-	    {_,Ymin,_,Ymax} = gstk_db:opt(DB,Gstkid,scrollregion),
-	    K = 1/(Ymax-Ymin),
-	    M = -K*Ymin,
-	    _Y = round((PercentOffViewTop - M)/K);
-	xscrollpos ->
-	    {PercentOffViewLeft,_} = tcl2erl:ret_tuple([Canvas," xvi"]),
-	    {Xmin,_,Xmax,_} = gstk_db:opt(DB,Gstkid,scrollregion),
-	    K = 1/(Xmax-Xmin),
-	    M = -K*Xmin,
-	    _X = round((PercentOffViewLeft-M)/K);
-	buttonpress   -> gstk_db:is_inserted(DB, Gstkid, buttonpress);
-	buttonrelease -> gstk_db:is_inserted(DB, Gstkid, buttonrelease);
-	configure     -> gstk_db:is_inserted(DB, Gstkid, configure);
-	destroy       -> gstk_db:is_inserted(DB, Gstkid, destroy);
-	enter         -> gstk_db:is_inserted(DB, Gstkid, enter);
-	focus         -> gstk_db:is_inserted(DB, Gstkid, focus);
-	keypress      -> gstk_db:is_inserted(DB, Gstkid, keypress);
-	keyrelease    -> gstk_db:is_inserted(DB, Gstkid, keyrelease);
-	leave         -> gstk_db:is_inserted(DB, Gstkid, leave);   
-	motion        -> gstk_db:is_inserted(DB, Gstkid, motion);
+read_option(Option, Gstkid, _MainW, DB, Canvas) -> read_option(DB, Gstkid, Option, Canvas).
 
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
-    end.
+% {% hidden above, % of total area that is visible + % hidden above}
+read_option(DB, Gstkid, xscrollpos, Canvas) ->
+    {PercentOffViewLeft, _} = tcl2erl:ret_tuple([Canvas, " xvi"]),
+    {Xmin, _, Xmax, _} = gstk_db:opt(DB, Gstkid, scrollregion),
+    K = 1 / (Xmax - Xmin),
+    _X = round((PercentOffViewLeft + K * Xmin) / K);
+read_option(DB, Gstkid, yscrollpos, Canvas) ->
+    {PercentOffViewTop, _} = tcl2erl:ret_tuple([Canvas, " yvi"]),
+    {_, Ymin, _, Ymax} = gstk_db:opt(DB, Gstkid, scrollregion),
+    K = 1 / (Ymax - Ymin),
+    _Y = round((PercentOffViewTop + K * Ymin) / K);
+read_option(DB, _Gstkid, {hit, {X, Y}}, Canvas) -> hit(DB, Canvas, X, Y, X, Y);
+read_option(DB, _Gstkid, {hit, [{X1, Y1}, {X2, Y2}]}, Canvas) -> hit(DB, Canvas, X1, Y1, X2, Y2);
+read_option(DB, Gstkid, Option, _Canvas) -> read_option(DB, Gstkid, Option).
 
-hit(DB,Canvas,X1,Y1,X2,Y2) ->
-    Ax1 = gstk:to_ascii(X1),
-    Ay1 = gstk:to_ascii(Y1),
-    Ax2 = gstk:to_ascii(X2),
-    Ay2 = gstk:to_ascii(Y2),
-    case tcl2erl:ret_list([Canvas," find overlapping ",
-			   Ax1,$ ,Ay1,$ ,Ax2,$ ,Ay2]) of
+read_option(DB, Gstkid, scrollregion) -> gstk_db:opt(DB, Gstkid, scrollregion);
+read_option(DB, Gstkid, Option) when Option =:= buttonpress; Option =:= buttonrelease; Option =:= motion;
+				     Option =:= configure;
+				     Option =:= destroy;
+				     Option =:= enter;
+				     Option =:= focus; Option =:= leave;
+				     Option =:= keypress; Option =:= keyrelease ->
+    gstk_db:is_inserted(DB, Gstkid, Option);
+read_option(_DB, Gstkid, Option) -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}.
+
+hit(DB, Canvas, X1, Y1, X2, Y2) ->
+    case tcl2erl:ret_list([Canvas, " find overlapping "|lists:join($ ,
+								   lists:map(fun gstk:to_ascii/1, [X1, Y1, X2, Y2]))]) of
 	Items when is_list(Items) ->
-	    [{_,Node}] = ets:lookup(DB,frontend_node),
-	    fix_ids(Items,DB,Canvas,Node);
-	Other ->
-	    {bad_result, Other}
+	    [{_, Node}] = ets:lookup(DB, frontend_node),
+	    fix_ids(Items, DB, Canvas, Node);
+	Other -> {bad_result, Other}
     end.
 
-fix_ids([Item|Items],DB,Canvas,Node) ->
-    [{gstk_db:lookup_item(DB,Canvas,Item),Node}|fix_ids(Items,DB,Canvas,Node)];
-fix_ids([],_,_,_) -> [].
+fix_ids(Items, DB, Canvas, Node) when is_list(Items) ->
+    lists:foldr(fun(Item, A) -> [{gstk_db:lookup_item(DB, Canvas, Item), Node}|A] end, [], Items).
 
 %%-----------------------------------------------------------------------------
 %%			       PRIMITIVES
@@ -307,15 +269,11 @@ bind(DB, Gstkid, TkW, Etype, On) ->
 	Cmd -> {c, Cmd}
     end.
 
-bind(DB, Gstkid, TkW, Etype, On, WS) ->
-    case On of
-	true  -> ebind(DB, Gstkid, TkW, Etype, WS, "");
-	false -> eunbind(DB, Gstkid, TkW, Etype, WS, "");
-	{true, Edata} -> ebind(DB, Gstkid, TkW, Etype, WS, Edata);
-	{false, Edata} -> eunbind(DB, Gstkid, TkW, Etype, WS, Edata);
-	_     -> invalid_option
-    end.
-
+bind(DB, Gstkid, TkW, Etype, false, WS) -> eunbind(DB, Gstkid, TkW, Etype, WS);
+bind(DB, Gstkid, TkW, Etype, {true, Edata}, WS) -> ebind(DB, Gstkid, TkW, Etype, WS, Edata);
+bind(DB, Gstkid, TkW, Etype, true, WS) -> bind(DB, Gstkid, TkW, Etype, {true, ""}, WS);
+bind(DB, Gstkid, TkW, Etype, {false, _Edata}, WS) -> bind(DB, Gstkid, TkW, Etype, false, WS);
+bind(_DB, _Gstkid, _TkW, _Etype, _On, _WS) -> invalid_option.
 
 %%
 %% Event bind on
@@ -325,49 +283,31 @@ bind(DB, Gstkid, TkW, Etype, On, WS) ->
 %% WS = Widget suffix for complex widgets
 %%
 ebind(DB, Gstkid, TkW, Etype, WS, Edata) ->
-    Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
-    P = ["bind ", TkW, WS],
-    Cmd = case Etype of
-	      motion -> [P, " <Motion> {erlsend ", Eref, " [",
-			 TkW, " canvasx %x] [", TkW, " canvasy %y] %x %y}"];
-	      keypress ->
-		  [P, " <Key> {erlsend ", Eref," %K %N 0 0 [",
-		   TkW, " canvasx %x] [", TkW, " canvasy %y]};",
-		   P, " <Shift-Key> {erlsend ", Eref, " %K %N 1 0 [",
-		   TkW, " canvasx %x] [", TkW, " canvasy %y]};",
-		   P, " <Control-Key> {erlsend ", Eref, " %K %N 0 1 [",
-		   TkW, " canvasx %x] [", TkW, " canvasy %y]};",
-		   P, " <Control-Shift-Key> {erlsend ", Eref," %K %N 1 1 [",
-		   TkW, " canvasx %x] [", TkW, " canvasy %y]}"];
-	      keyrelease ->
-		  [P, " <KeyRelease> {erlsend ", Eref," %K %N 0 0 [",
-		   TkW, " canvasx %x] [", TkW, " canvasy %y]};",
-		   P, " <Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 0 [",
-		   TkW, " canvasx %x] [", TkW, " canvasy %y]};",
-		   P, " <Control-KeyRelease> {erlsend ", Eref, " %K %N 0 1 [",
-		   TkW, " canvasx %x] [", TkW, " canvasy %y]};",
-		  P," <Control-Shift-KeyRelease> {erlsend ",Eref," %K %N 1 1[",
-		   TkW, " canvasx %x] [", TkW, " canvasy %y]}"];
-	      buttonpress ->
-		  [P, " <Button> {erlsend ", Eref, " %b [",
-		   TkW, " canvasx %x] [", TkW, " canvasy %y] %x %y}"];
-	      buttonrelease ->
-		  [P, " <ButtonRelease> {erlsend ", Eref, " %b [",
-		   TkW, " canvasx %x] [", TkW, " canvasy %y] %x %y}"];
-	      leave -> [P, " <Leave> {erlsend ", Eref, "}"];
-	      enter -> [P, " <Enter> {erlsend ", Eref, "}"];
-	      destroy ->
-		  [P, " <Destroy> {if {\"%W\"==\"", [TkW, WS], 
-		   "\"} {erlsend ", Eref, "}}"];
-	      focus ->
-		  [P, " <FocusIn> {erlsend ", Eref, " true};" ,
-		   P, " <FocusOut> {erlsend ", Eref, " false}"];
-	      configure ->
-		  [P, " <Configure> {if {\"%W\"==\"", [TkW, WS], 
-		   "\"} {erlsend ", Eref, " %w %h %x %y}}"]
-	  end,
-    Cmd.
-		  
+    ebind(gstk_db:insert_event(DB, Gstkid, Etype, Edata), ["bind ", TkW, WS], TkW, Etype, WS).
+
+ebind(Eref, P, _TkW, leave, _WS) -> [P, " <Leave> {erlsend ", Eref, "}"];
+ebind(Eref, P, _TkW, enter, _WS) -> [P, " <Enter> {erlsend ", Eref, "}"];
+ebind(Eref, P, TkW, destroy, WS) -> [P, " <Destroy> {if {\"%W\"==\"", [TkW, WS], "\"} {erlsend ", Eref, "}}"];
+ebind(Eref, P, TkW, configure, WS) ->
+    [P, " <Configure> {if {\"%W\"==\"", [TkW, WS], "\"} {erlsend ", Eref, " %w %h %x %y}}"];
+ebind(Eref, P, TkW, motion, _WS) ->
+    [P, " <Motion> {erlsend ", Eref, " [", TkW, " canvasx %x] [", TkW, " canvasy %y] %x %y}"];
+ebind(Eref, P, TkW, buttonpress, _WS) ->
+    [P, " <Button> {erlsend ", Eref, " %b [", TkW, " canvasx %x] [", TkW, " canvasy %y] %x %y}"];
+ebind(Eref, P, TkW, buttonrelease, _WS) ->
+    [P, " <ButtonRelease> {erlsend ", Eref, " %b [", TkW, " canvasx %x] [", TkW, " canvasy %y] %x %y}"];
+ebind(Eref, P, _TkW, focus, _WS) ->
+    [P, " <FocusIn> {erlsend ", Eref, " true};" , P, " <FocusOut> {erlsend ", Eref, " false}"];
+ebind(Eref, P, TkW, keypress, _WS) ->
+    [P, " <Key> {erlsend ", Eref, " %K %N 0 0 [", TkW, " canvasx %x] [", TkW, " canvasy %y]};",
+     P, " <Shift-Key> {erlsend ", Eref, " %K %N 1 0 [", TkW, " canvasx %x] [", TkW, " canvasy %y]};",
+     P, " <Control-Key> {erlsend ", Eref, " %K %N 0 1 [", TkW, " canvasx %x] [", TkW, " canvasy %y]};",
+     P, " <Control-Shift-Key> {erlsend ", Eref, " %K %N 1 1 [", TkW, " canvasx %x] [", TkW, " canvasy %y]}"];
+ebind(Eref, P, TkW, keyrelease, _WS) ->
+    [P, " <KeyRelease> {erlsend ", Eref, " %K %N 0 0 [", TkW, " canvasx %x] [", TkW, " canvasy %y]};",
+     P, " <Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 0 [", TkW, " canvasx %x] [", TkW, " canvasy %y]};",
+     P, " <Control-KeyRelease> {erlsend ", Eref, " %K %N 0 1 [", TkW, " canvasx %x] [", TkW, " canvasy %y]};",
+     P, " <Control-Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 1[", TkW, " canvasx %x] [", TkW, " canvasy %y]}"].
 
 %%
 %% Unbind event
@@ -377,39 +317,22 @@ ebind(DB, Gstkid, TkW, Etype, WS, Edata)
 %%
 %% WS = Widget suffix for complex widgets
 %%
-eunbind(DB, Gstkid, TkW, Etype, WS, _Edata) ->
+eunbind(DB, Gstkid, TkW, Etype, WS) ->
     gstk_db:delete_event(DB, Gstkid, Etype),
-    P = ["bind ", TkW, WS],
-    Cmd = case Etype of
-	      motion ->
-		  [P, " <Motion> {}"];
-	      keypress -> 
-		   [P, " <KeyRelease> {};",
-		    P, " <Shift-KeyRelease> {};",
-		    P, " <Control-KeyRelease> {};",
-		    P, " <Control-Shift-KeyRelease> {}"];
-	      keyrelease -> 
-		   [P, " <KeyRelease> {};",
-		    P, " <Shift-KeyRelease> {};",
-		    P, " <Control-KeyRelease> {};",
-		    P, " <Control-Shift-KeyRelease> {}"];
-	      buttonpress ->
-		  [P, " <ButtonPress> {}"];
-	      buttonrelease ->
-		  [P, " <ButtonRelease> {}"];
-	      leave ->
-		  [P, " <Leave> {}"];
-	      enter ->
-		  [P, " <Enter> {}"];
-	      destroy ->
-		  [P, " <Destroy> {}"];
-	      focus ->
-		  [P, " <FocusIn> {};",
-		   P, " <FocusOut> {}"];
-	      configure ->
-		  [P, " <Configure> {}"]
-	  end,
-    Cmd.
+    eunbind(Etype, ["bind ", TkW, WS]).
+
+eunbind(motion, P) -> [P, " <Motion> {}"];
+eunbind(buttonpress, P) -> [P, " <ButtonPress> {}"];
+eunbind(buttonrelease, P) -> [P, " <ButtonRelease> {}"];
+eunbind(leave, P) -> [P, " <Leave> {}"];
+eunbind(enter, P) -> [P, " <Enter> {}"];
+eunbind(destroy, P) -> [P, " <Destroy> {}"];
+eunbind(configure, P) -> [P, " <Configure> {}"];
+eunbind(focus, P) -> [P, " <FocusIn> {};", P, " <FocusOut> {}"];
+eunbind(keypress, P) -> [P, " <Key> {};", P, " <Shift-Key> {};", P, " <Control-Key> {};", P, " <Control-Shift-Key> {}"];
+eunbind(keyrelease, P) ->
+    [P, " <KeyRelease> {};", P, " <Shift-KeyRelease> {};",
+     P, " <Control-KeyRelease> {};", P, " <Control-Shift-KeyRelease> {}"].
 
 %%======================================================================
 %% Item library
@@ -417,25 +340,20 @@ eunbind(DB, Gstkid, TkW, Etype, WS, _Eda
 
 mk_cmd_and_exec(Options, Gstkid, Canvas, AItem, SCmd, DB) ->
     case make_command(Options, Gstkid, Canvas, AItem, SCmd, DB) of
-	{error,Reason} -> {error,Reason};
-	Cmd when is_list(Cmd) ->
-	    gstk:exec(Cmd)
+	{error, _Reason} = E -> E;
+	Cmd when is_list(Cmd) -> gstk:exec(Cmd)
     end.
 
-mk_cmd_and_call(Opts,Gstkid, CanvasTkW, MCmd, DB) ->
-    case make_command(Opts,Gstkid, CanvasTkW, MCmd, DB) of
-	{error,Reason} -> {error,Reason};
-	Cmd when is_list(Cmd) ->
-	    case tcl2erl:ret_int(Cmd) of
-		Item when is_integer(Item) ->
-		    G2 = gstk_db:lookup_gstkid(DB,Gstkid#gstkid.id), % buu, not nice
-		    NewGstkid = G2#gstkid{widget_data=Item},
-		    NewGstkid;
-		Bad_result ->
-		    {error,Bad_result}
-	    end
+mk_cmd_and_call(Opts, Gstkid, CanvasTkW, MCmd, DB) ->
+    case make_command(Opts, Gstkid, CanvasTkW, MCmd, DB) of
+	{error, _Reason} = E -> E;
+	Cmd when is_list(Cmd) -> case tcl2erl:ret_int(Cmd) of
+				     Item when is_integer(Item) ->
+					 G2 = gstk_db:lookup_gstkid(DB, Gstkid#gstkid.id), % buu, not nice
+					 G2#gstkid{widget_data = Item};
+				     Bad_result -> {error, Bad_result}
+				 end
     end.
-	    
 
 %%----------------------------------------------------------------------
 %% MCmd = Mandatory command
@@ -447,70 +365,49 @@ mk_cmd_and_call(Opts,Gstkid, CanvasTkW,
 %% Comment: no placer options (we don't have to consider all permutations)
 %%----------------------------------------------------------------------
 make_command(Options, Gstkid, Canvas, AItem, SCmd, DB) ->
-    case gstk_generic:out_opts(Options,Gstkid,Canvas,DB,AItem, [],[],[]) of
+    case gstk_generic:out_opts(Options, Gstkid, Canvas, DB, AItem, [], [], []) of
 	{[], [], []} -> [];
 	{Si, [], []} -> [SCmd, Si];
 	{[], [], Co} -> Co;
 	{Si, [], Co} -> [SCmd, Si, $;, Co];
-	{error,Reason} -> {error,Reason}
+	{error, _Reason} = E -> E
     end.
 
 make_command(Options, Gstkid, Canvas, MCmd, DB) ->
-    case gstk_generic:out_opts(Options,Gstkid,Canvas,DB,"$w",[],[],[]) of
+    case gstk_generic:out_opts(Options, Gstkid, Canvas, DB, "$w", [], [], []) of
 	{[], [], []} -> MCmd;
 	{Si, [], []} -> [MCmd, Si];
-	{[], [], Co} -> ["set w [", MCmd, "];", Co, "set d $w"];
-	{Si, [], Co} -> ["set w [", MCmd, Si, "];", Co, "set d $w"];
-	{error,Reason} -> {error,Reason}
+	{Si, [], Co} -> ["set w [", MCmd] ++ Si ++ ["];", Co, "set d $w"];
+	{error, _Reason} = E -> E
     end.
 
-item_config(DB, Gstkid, Opts) ->
-    #gstkid{widget=Canvas,widget_data=Item}=Gstkid,
+item_config(DB, #gstkid{widget = Canvas, widget_data = Item} = Gstkid, Opts) ->
     AItem = gstk:to_ascii(Item),
-    SCmd = [Canvas, " itemconf ", AItem],
-    case make_command(Opts, Gstkid, Canvas, AItem, SCmd, DB) of
-	{error,Reason} -> {error,Reason};
-	Cmd when is_list(Cmd) ->
-	    gstk:exec(Cmd)
+    case make_command(Opts, Gstkid, Canvas, AItem, [Canvas, " itemconf ", AItem], DB) of
+	{error, _Reason} = E -> E;
+	Cmd when is_list(Cmd) -> gstk:exec(Cmd)
     end.
 
-pickout_coords([{coords,Coords} | Rest], Opts, ObjType, NbrOfCoords) 
-  when length(Coords) == NbrOfCoords ->
+pickout_coords([], _Opts, ObjType, NbrOfCoords) ->
+    {error, lists:flatten(io_lib:format("A ~w must have ~w coordinates", [ObjType, NbrOfCoords]))};
+pickout_coords([{coords, Coords}|Rest], Opts, ObjType, NbrOfCoords) when length(Coords) =:= NbrOfCoords ->
     case coords(Coords) of
-	invalid ->
-	    {error, io_lib:format("A ~w must have ~w coordinates",
-				  [ObjType,NbrOfCoords])};
-	RealCoords ->
-	    {RealCoords, lists:append(Rest, Opts)}
+	invalid -> pickout_coords([], Opts, ObjType, NbrOfCoords);
+	RealCoords -> {RealCoords, lists:append(Rest, Opts)}
     end;
-pickout_coords([Opt | Rest], Opts, ObjType, NbrOfCoords) ->
-    pickout_coords(Rest, [Opt|Opts], ObjType, NbrOfCoords);
-pickout_coords([], _Opts, ObjType, NbrOfCoords) ->
-    {error, io_lib:format("A ~w must have ~w coordinates",
-			  [ObjType,NbrOfCoords])}.
+pickout_coords([Opt|Rest], Opts, ObjType, NbrOfCoords) -> pickout_coords(Rest, [Opt|Opts], ObjType, NbrOfCoords).
 
-coords([{X,Y} | R]) when is_number(X),is_number(Y) ->
-    [gstk:to_ascii(X), " ", gstk:to_ascii(Y), " ", coords(R)];
-coords([_]) -> %% not a pair
-    invalid;
-coords([]) ->
-    [].
+coords([{X, Y}|R]) when is_number(X), is_number(Y) -> [gstk:to_ascii(X), " ", gstk:to_ascii(Y), " ", coords(R)];
+coords([_]) -> invalid; %% not a pair
+coords([]) -> [].
 
-item_delete_impl(DB,Gstkid) ->
+item_delete_impl(DB, #gstkid{widget = Canvas, widget_data = Item, parent = P, id = ID, objtype = Type} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    #gstkid{widget=Canvas,widget_data=Item,parent=P,id=ID,objtype=Type}=Gstkid,
-    {P,ID,gstk_widgets:type2mod(Type), [Canvas, Item]}.
-
-
-upd_gstkid(DB, Gstkid, Opts) ->
-    #gstkid{parent=Parent,owner=Owner}=Gstkid,
-    Pgstkid = gstk_db:lookup_gstkid(DB, Parent, Owner),
-    SO = Pgstkid#gstkid.widget_data,
-    CanvasTkW = SO#so.object,
-    gstk_db:insert_opt(DB,Gstkid,{coords,gs:val(coords,Opts)}),
-    gstk_db:update_widget(DB,Gstkid#gstkid{widget=CanvasTkW,widget_data=no_item}).
+    {P, ID, gstk_widgets:type2mod(Type), [Canvas, Item]}.
 
+upd_gstkid(DB, #gstkid{parent = Parent, owner = Owner} = Gstkid, Opts) ->
+    #gstkid{widget_data = SO} = gstk_db:lookup_gstkid(DB, Parent, Owner),
+    gstk_db:insert_opt(DB, Gstkid, {coords, gs:val(coords, Opts)}),
+    gstk_db:update_widget(DB, Gstkid#gstkid{widget = SO#so.object, widget_data = no_item}).
 
 %%% ----- Done -----
-
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_checkbutton.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_checkbutton.erl
--- otp_src_19.0.5/lib/gs/src/gstk_checkbutton.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_checkbutton.erl	2016-08-25 16:37:44.562693392 +0300
@@ -31,8 +31,8 @@
 %%  Attributes:
 %%	activebg		Color
 %%	activefg		Color
-%%	align			n,w,s,e,nw,se,ne,sw,center
-%%	anchor			n,w,s,e,nw,se,ne,sw,center
+%%	align			n, w,s, e,nw, se, ne, sw, center
+%%	anchor			n, w,s, e,nw, se, ne, sw, center
 %%	bg			Color
 %%	bw			Int
 %%	data			Data
@@ -88,7 +88,7 @@
 %%	font			??????
 %%
 
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -100,15 +100,14 @@
 %% Purpose    	: Create a widget of the type defined in this module.
 %% Return 	: [Gsid_of_new_widget | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-create(DB, GstkId, Opts) ->
-    TkW = gstk_generic:mk_tkw_child(DB,GstkId),
-    {G, GID, _NOpts} = fix_group(Opts, DB, GstkId#gstkid.owner),
-    NGstkId=GstkId#gstkid{widget=TkW,widget_data={G, GID}},
-    PlacePreCmd = [";place ", TkW],
-    case gstk_generic:make_command(Opts,NGstkId,TkW,"",PlacePreCmd,DB) of
-	{error,Reason} -> {error,Reason};
+create(DB, #gstkid{owner = Owner} = GstkId, Opts) ->
+    TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+    {G, GID, _NOpts} = fix_group(Opts, DB, Owner),
+    NGstkId = GstkId#gstkid{widget = TkW, widget_data = {G, GID}},
+    case gstk_generic:make_command(Opts, NGstkId, TkW, "", [";place ", TkW], DB) of
+	{error, _Reason} = E -> E;
 	Cmd when is_list(Cmd) ->
-	    gstk:exec(["checkbutton ", TkW," -bo 2 -indi true ",Cmd]),
+	    gstk:exec(["checkbutton ", TkW, " -bo 2 -indi true ", Cmd]),
 	    NGstkId
     end.
 
@@ -121,12 +120,9 @@ create(DB, GstkId, Opts) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    TkW = Gstkid#gstkid.widget,
-    {NOpts, NGstkid} = fix_group(Opts, DB, Gstkid#gstkid.owner, Gstkid),
-    SimplePreCmd = [TkW, " conf"],
-    PlacePreCmd = [";place ", TkW],
-    gstk_generic:mk_cmd_and_exec(NOpts,NGstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW, owner = Owner} = Gstkid, Opts) ->
+    {NOpts, NGstkid} = fix_group(Opts, DB, Owner, Gstkid),
+    gstk_generic:mk_cmd_and_exec(NOpts, NGstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -137,9 +133,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -149,12 +143,11 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW, widget_data = Data} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    {_, Gid} = Gstkid#gstkid.widget_data,
+    {_, Gid} = Data,
     gstk_db:delete_bgrp(DB, Gid),
-    Gstkid#gstkid.widget.
-
+    TkW.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: event/5
@@ -167,22 +160,9 @@ delete(DB, Gstkid) ->
 %%		
 %% Return 	: true
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-event(DB, Gstkid, Etype, Edata, Args) ->
-    Arg2 = case Etype of
-	       click ->
-		   [Text, Bool | Rest] = Args,
-		   RBool = case Bool of
-			       1      -> true;
-			       _Other2 -> false
-			   end,
-		   {G, _Gid} = Gstkid#gstkid.widget_data,
-		   [Text, G, RBool | Rest];
-	       _Other3 ->
-		   Args
-	   end,
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Arg2).
-
-
+event(DB, #gstkid{widget_data = {G, _Gid}} = Gstkid, click, Edata, [Text, Bool|Rest]) ->
+    gstk_generic:event(DB, Gstkid, click, Edata, [Text, G, Bool =:= 1| Rest]);
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%------------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -197,22 +177,32 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
-    case Option of
-	{disabledfg,  Color} -> {s, [" -disabledforegr ", gstk:to_color(Color)]};
-	{group,       Group} -> {s, [" -var ", gstk:to_ascii(Group)]};
-	{selectbg,    Color} -> {s, [" -selectc ", gstk:to_color(Color)]};
-	{underline,     Int} -> {s, [" -un ", gstk:to_ascii(Int)]};
-	{wraplength,    Int} -> {s, [" -wr ", gstk:to_ascii(Int)]};
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
 
-	flash                -> {c, [TkW, " f;"]};
-	invoke               -> {c, [TkW, " i;"]};
-	toggle               -> {c, [TkW, " to;"]};
-	{select,       true} -> {c, [TkW, " se;"]};
-	{select,      false} -> {c, [TkW, " de;"]};
-	{click,          On} -> cbind(DB, Gstkid, click, On);
-	_                    -> invalid_option
-    end.
+option({click, On}, Gstkid, _TkW, DB) -> cbind(DB, Gstkid, click, On);
+option(Option, _Gstkid, TkW, _DB) -> option(Option, TkW).
+
+option(flash, TkW) -> option_c(" f;", TkW);
+option(invoke, TkW) -> option_c(" i;", TkW);
+option(toggle, TkW) -> option_c(" to;", TkW);
+option({select, true}, TkW) -> option_c(" se;", TkW);
+option({select, false}, TkW) -> option_c(" de;", TkW);
+option(Option, _TkW) -> option(Option).
+
+option({disabledfg, Color}) -> to_color(" -disabledforegr ", Color);
+option({selectbg, Color}) -> to_color(" -selectc ", Color);
+option({group, Group}) -> to_ascii(" -var ", Group);
+option({underline, Int}) -> to_ascii(" -un ", Int);
+option({wraplength, Int}) -> to_ascii(" -wr ", Int);
+option(_Option) -> invalid_option.
+
+option_c(Str, TkW) -> {c, [TkW, Str]}.
+
+to_color(Str, Color) -> option_s(Str, gstk:to_color(Color)).
+
+to_ascii(Str, Val) -> option_s(Str, gstk:to_ascii(Val)).
+
+option_s(Str, Val) -> {s, [Str, Val]}.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/3
@@ -224,21 +214,30 @@ option(Option, Gstkid, TkW, DB,_) ->
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid, TkW,DB,_) -> 
-    case Option of
-	disabledfg    -> tcl2erl:ret_color([TkW," cg -disabledforegr"]);
-	group         -> {G, _} = Gstkid#gstkid.widget_data, G;
-	selectbg      -> tcl2erl:ret_color([TkW," cg -selectc"]);
-	groupid       -> {_, Gid} = Gstkid#gstkid.widget_data, Gid;
-	underline     -> tcl2erl:ret_int([TkW," cg -un"]);
-	wraplength    -> tcl2erl:ret_int([TkW," cg -wr"]);
-	select        -> tcl2erl:ret_bool(["set x [", TkW,
-					   " cg -va];global $x;set $x"]);
-	
-	click         -> gstk_db:is_inserted(DB, Gstkid, click);
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(Option, Gstkid, TkW, DB, _) -> read_option(Option, Gstkid, TkW, DB).
+
+read_option(click, Gstkid, _TkW, DB) -> gstk_db:is_inserted(DB, Gstkid, click);
+read_option(Option, Gstkid, TkW, _DB) -> read_option(Option, Gstkid, TkW).
+
+read_option(group, #gstkid{widget_data = {G, _}}, _TkW) -> G;
+read_option(groupid, #gstkid{widget_data = {_, G}}, _TkW) -> G;
+read_option(Option, Gstkid, TkW) ->
+    case read_option(Option, TkW) of
+	invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+	O -> O
     end.
 
+read_option(disabledfg, TkW) -> ret_color(" cg -disabledforegr", TkW);
+read_option(selectbg, TkW) -> ret_color(" cg -selectc", TkW);
+read_option(underline, TkW) -> ret_int(" cg -un", TkW);
+read_option(wraplength, TkW) -> ret_int(" cg -wr", TkW);
+read_option(select, TkW) -> tcl2erl:ret_bool(["set x [", TkW, " cg -va];global $x;set $x"]);
+read_option(_Option, _TkW) -> invalid_option.
+
+ret_color(Str, TkW) -> tcl2erl:ret_color([TkW, Str]).
+
+ret_int(Str, TkW) -> tcl2erl:ret_int([TkW, Str]).
+
 %%------------------------------------------------------------------------------
 %%			       PRIMITIVES
 %%------------------------------------------------------------------------------
@@ -246,75 +245,48 @@ read_option(Option,Gstkid, TkW,DB,_) ->
 %% create version
 fix_group(Opts, DB, Owner) ->
     {G, GID, NOpts} = fg(Opts, erlNIL, erlNIL, []),
-    NG = case G of
-	     erlNIL -> 
-		 Vref = gstk_db:counter(DB, variable),
-		 list_to_atom(lists:flatten(["cb", gstk:to_ascii(Vref)]));
-	     Other1 -> Other1
+    NG = if
+	     G =:= erlNIL -> list_to_atom(lists:flatten(["cb", gstk:to_ascii(gstk_db:counter(DB, variable))]));
+	     true -> G
 	 end,
-    RGID = case GID of
-	       erlNIL -> {cbgrp, NG, Owner};
-	       Other2 -> Other2
+    RGID = if
+	       GID =:= erlNIL -> {cbgrp, NG, Owner};
+	       true -> GID
 	   end,
-    RG = gstk_db:insert_bgrp(DB, RGID),
-    {NG, RGID, [{group, RG} | NOpts]}.
-    
+    {NG, RGID, [{group, gstk_db:insert_bgrp(DB, RGID)}|NOpts]}.
+
 %% config version
-fix_group(Opts, DB, Owner, Gstkid) ->
-    {RG, RGID} = Gstkid#gstkid.widget_data,
-    {G, GID, NOpts} = fg(Opts, RG, RGID, []),
-    case {G, GID} of
-	{RG, RGID} ->
-	    {NOpts, Gstkid};
-	{NG, RGID} ->
-	    NGID = {cbgrp, NG, Owner},
-	    gstk_db:delete_bgrp(DB, RGID),
-	    NRG = gstk_db:insert_bgrp(DB, NGID),
-	    NGstkid = Gstkid#gstkid{widget_data={NG,NGID}},
-	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{group, NRG} | NOpts], NGstkid};
-	{_, NGID} when NGID =/= RGID ->
+fix_group(Opts, DB, Owner, #gstkid{widget_data = {RG, RGID}} = Gstkid) ->
+    case fg(Opts, RG, RGID, []) of
+	{RG, RGID, NOpts} -> {NOpts, Gstkid};
+	{NG, N, NOpts} ->
+	    NGID = if
+		       N =:= RGID -> {cbgrp, NG, Owner};
+		       true -> N
+		   end,
 	    gstk_db:delete_bgrp(DB, RGID),
 	    NRG = gstk_db:insert_bgrp(DB, NGID),
-	    NGstkid = Gstkid#gstkid{widget_data={RG,NGID}},
+	    NGstkid = Gstkid#gstkid{widget_data = {RG, NGID}},
 	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{group, NRG} | NOpts], NGstkid}
+	    {[{group, NRG}|NOpts], NGstkid}
     end.
 
-
-
-fg([{group, G} | Opts], _, GID, Nopts) ->
-    fg(Opts, G, GID, Nopts);
-
-fg([{groupid, GID} | Opts], G, _, Nopts) ->
-    fg(Opts, G, GID, Nopts);
-
-fg([Opt | Opts], G, GID, Nopts) ->
-    fg(Opts, G, GID, [Opt | Nopts]);
-
-fg([], Group, GID, Opts) ->
-    {Group, GID, Opts}.
-
+fg([{group, G}|Opts], _, GID, Nopts) -> fg(Opts, G, GID, Nopts);
+fg([{groupid, GID}|Opts], G, _, Nopts) -> fg(Opts, G, GID, Nopts);
+fg([Opt|Opts], G, GID, Nopts) -> fg(Opts, G, GID, [Opt|Nopts]);
+fg([], Group, GID, Opts) -> {Group, GID, Opts}.
 
 %%
 %% Config bind
 %%
-cbind(DB, Gstkid, Etype, On) ->
-    TkW = Gstkid#gstkid.widget,
-    Cmd = case On of
-	      {true, Edata} ->
-		  Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
-		  [" -command {erlsend  ", Eref, " \\\"[", TkW,
-		   " cg -text]\\\" \[expr \$[", TkW, " cg -va]\]}"];
-	      true ->
-		  Eref = gstk_db:insert_event(DB, Gstkid, Etype, ""),
-		  [" -command {erlsend  ", Eref, " \\\"[", TkW,
-		   " cg -text]\\\" \[expr \$[", TkW, " cg -va]\]}"];
-	      _Other ->
+cbind(DB, Gstkid, Etype, true) -> cbind(DB, Gstkid, Etype, {true, ""});
+cbind(DB, #gstkid{widget = TkW} = Gstkid, Etype, On) ->
+    {s, case On of
+	    {true, Edata} -> [" -command {erlsend  ", gstk_db:insert_event(DB, Gstkid, Etype, Edata),
+			      " \\\"[", TkW, " cg -text]\\\" \[expr \$[", TkW, " cg -va]\]}"];
+	    _Other ->
 		  gstk_db:delete_event(DB, Gstkid, Etype),
 		  " -command {}"
-	  end,
-    {s, Cmd}.
+	end}.
 
 %% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_db.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_db.erl
--- otp_src_19.0.5/lib/gs/src/gstk_db.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_db.erl	2016-08-25 16:37:44.562693392 +0300
@@ -51,8 +51,7 @@
 	 is_inserted/3,
 	 lookup_kids/2,
 	 insert_def/3,
-	 opt/4,
-	 opt/3,
+	 opt/4, opt/3,
 	 insert_opt/3,
 	 default_container_opts/3,
 	 default_opts/3,
@@ -61,40 +60,30 @@
 
 -include("gstk.hrl").
 
-
 %% ------------------------------------------------------------
 %%                      INITIALIZATION
 %% ------------------------------------------------------------
 
 init(_Opts) ->
-    put(events,ets:new(gstk_db, [public, set])),
-    put(kids,ets:new(gstk_db, [public, bag])),
-    put(defaults,ets:new(gstk_db, [public, bag])),
-    put(deleted,ets:new(gstk_db, [public, bag])),
-    put(options,ets:new(gstk_db, [public, set])),
-    ets:new(gstk_db, [public, set]).
+    lists:foreach(fun({K, T}) -> put(K, new(T)) end,
+		  [{events, set}, {kids, bag}, {defaults, bag}, {deleted, bags}, {options, set}]),
+    new(set).
+
+new(T) -> ets:new(gstk_db, [public, T]).
 
 %% -----------------------------------------------------------------
 %%                 PRIMITIVE DB INTERFACE
 %% -----------------------------------------------------------------
 
-insert(DB, Key, Value) ->
-    ets:insert(DB, {Key, Value}).
-
+insert(DB, Key, Value) -> ets:insert(DB, {Key, Value}).
 
 lookup(DB, Key) ->
-    Result =
-	case ets:lookup(DB, Key) of
-	    [{Key, Value}] -> Value;
-	    _ -> undefined
-	end,
-    Result.
-
-
-delete(DB, Key) ->
-    ets:delete(DB, Key).
-
+    case ets:lookup(DB, Key) of
+	[{Key, Value}] -> Value;
+	_ -> undefined
+    end.
 
+delete(DB, Key) -> ets:delete(DB, Key).
 
 %% -----------------------------------------------------------------
 %%               NOT SO PRIMITIVE DB INTERFACE
@@ -103,42 +92,33 @@ delete(DB, Key) ->
 %% -----------------------------------------------------------------
 %%                  HANDLE EVENTS
 %% -----------------------------------------------------------------
-insert_event(DB, Gstkid, Etype, Edata) ->
-    ID = Gstkid#gstkid.id,
-    Rdata =
-	case Edata of
-	    [] -> opt(DB,ID,data);
-	    _Other1 -> Edata
-	end,
+insert_event(DB, #gstkid{id = ID}, Etype, Edata) ->
+    Rdata = if
+		Edata =:= [] -> opt(DB, ID, data);
+		true -> Edata
+	    end,
     Events = lookup_events(DB, ID),
-    case lists:keysearch(Etype, 2, Events) of
-	{value, {Etag, _, _}} ->
-	    NewEvents =
-		lists:keyreplace(Etype, 2, Events, {Etag, Etype, Rdata}),
-	    ets:insert(get(events), {{events, ID}, NewEvents}),
-	    [$#, gstk:to_ascii(ID), " ", Etag];
-	_Other2 ->
-	    Etag = etag(Etype),
-	    NewEvents = [{Etag, Etype, Rdata} | Events],
-	    ets:insert(get(events), {{events, ID}, NewEvents}),
-	    [$#, gstk:to_ascii(ID), " ", Etag]
-    end.
+    {Etag, Event} = case lists:keyfind(Etype, 2, Events) of
+			false ->
+			    E = etag(Etype),
+			    {E, [{E, Etype, Rdata}|Events]};
+			{E, _, _} -> {E, lists:keyreplace(Etype, 2, Events, {E, Etype, Rdata})}
+		    end,
+    ets:insert(get(events), {{events, ID}, Event}),
+    [$#, gstk:to_ascii(ID), " ", Etag].
 
-etag(Etype) ->
-    case Etype of
-	click -> "c";
-	doubleclick -> "dc";
-	configure -> "co";
-	enter -> "e";
-	leave -> "l";
-	motion -> "m";
-	buttonpress -> "bp";
-	buttonrelease -> "br";
-	focus -> "f";
-	destroy -> "d";
-	keypress -> "kp";
-	keyrelease -> "kr"
-    end.
+etag(click) -> "c";
+etag(doubleclick) -> "dc";
+etag(configure) -> "co";
+etag(enter) -> "e";
+etag(leave) -> "l";
+etag(motion) -> "m";
+etag(buttonpress) -> "bp";
+etag(buttonrelease) -> "br";
+etag(focus) -> "f";
+etag(destroy) -> "d";
+etag(keypress) -> "kp";
+etag(keyrelease) -> "kr".
 
 lookup_events(_DB, ID) ->
     case lookup(get(events), {events, ID}) of
@@ -147,258 +127,209 @@ lookup_events(_DB, ID) ->
     end.
 
 lookup_event(DB, ID, Etag) ->
-    case lists:keysearch(Etag, 1, lookup_events(DB, ID)) of
-	{value, {Etag, Etype, Edata}} ->
-	    {Etype, Edata};
-	_Other ->
-	    nonexisting_event
+    case lists:keyfind(Etag, 1, lookup_events(DB, ID)) of
+	false -> nonexisting_event;
+	{_Etag, Etype, Edata} -> {Etype, Edata}
     end.
 
-delete_event(DB, Gstkid, Etype) ->
-    ID = Gstkid#gstkid.id,
-    NewEvents = lists:keydelete(Etype, 2, lookup_events(DB, ID)),
-    ets:insert(get(events), {{events, ID}, NewEvents}).
+delete_event(DB, #gstkid{id = ID}, Etype) ->
+    ets:insert(get(events), {{events, ID}, lists:keydelete(Etype, 2, lookup_events(DB, ID))}).
 
 %% -----------------------------------------------------------------
 %%                  HANDLE BUTTON GROUPS
 %% -----------------------------------------------------------------
 insert_bgrp(DB, Key) ->
-    case ets:lookup(DB, Key) of
-	[] ->
-	    {_Bgrp, RG, _Owner} = Key,
-	    insert(DB, Key, {0, RG}),
-	    RG;
-	[{_, {Counter, RG}}] ->
-	    insert(DB, Key, {Counter+1, RG}),
-	    RG
-    end.
-
+    {_, RG} = BGRP = case ets:lookup(DB, Key) of
+			 [] ->
+			     {_Bgrp, Rg, _Owner} = Key,
+			     {0, Rg};
+			 [{_, {Counter, Rg}}] -> {Counter + 1, Rg}
+		     end,
+    insert(DB, Key, BGRP),
+    RG.
 
 delete_bgrp(DB, Key) ->
     case ets:lookup(DB, Key) of
-	[] ->
-	    true;
-	[{_, {0, _RG}}] ->
-	    delete(DB, Key),
-	    true;
-	[{_, {Counter, RG}}] ->
-	    insert(DB, Key, {Counter-1, RG}),
-	    true
-    end.
-
+	[] -> [];
+	[{_, {0, _RG}}] -> delete(DB, Key);
+	[{_, {Counter, RG}}] -> insert(DB, Key, {Counter - 1, RG})
+    end,
+    true.
 
 %% -----------------------------------------------------------------
 %%  insert things
 
-update_widget(DB, Gstkid) ->
-    ID = Gstkid#gstkid.id,
+update_widget(DB, #gstkid{id = ID} = Gstkid) ->
     insert(DB, ID, Gstkid),
     Gstkid.
 
-insert_gs(DB,Gstkid) ->
-    update_widget(DB,Gstkid).
+insert_gs(DB, Gstkid) -> update_widget(DB, Gstkid).
 
-insert_widget(DB, Gstkid) ->
-    ID = Gstkid#gstkid.id,
-    insert_kid(DB, Gstkid#gstkid.parent, ID),
+insert_widget(DB, #gstkid{id = ID, parent = Parent} = Gstkid) ->
+    insert_kid(DB, Parent, ID),
     insert(DB, ID, Gstkid),
     Gstkid.
 
-insert_kid(_DB, Parent, Kid) ->
-    ets:insert(get(kids), {{kids, Parent},Kid}).
+insert_kid(_DB, Parent, Kid) -> ets:insert(get(kids), {{kids, Parent}, Kid}).
 
-delete_kid(_DB, Parent, Kid) ->
-    ets:match_delete(get(kids), {{kids, Parent},Kid}).
+delete_kid(_DB, Parent, Kid) -> ets:match_delete(get(kids), {{kids, Parent}, Kid}).
 
-lookup_kids(_DB, Parent) ->
-    ril(ets:match(get(kids), {{kids, Parent},'$1'})).
+lookup_kids(_DB, Parent) -> ril(ets:match(get(kids), {{kids, Parent}, '$1'})).
 
 %%----------------------------------------------------------------------
-%% Options are stored as {{Id,Opt},Val}
+%% Options are stored as {{Id, Opt}, Val}
 %%----------------------------------------------------------------------
-insert_opt(_DB,Id,{default,ObjType,Opt}) ->
-    insert_def(Id,ObjType,Opt);
-insert_opt(_DB,#gstkid{id=Id},{Key,Val}) ->
-    ets:insert(get(options),{{Id,Key},Val});
-insert_opt(_DB,Id,{Key,Val}) ->
-    ets:insert(get(options),{{Id,Key},Val}).
+insert_opt(_DB, Id, Data) -> insert_opt(Id, Data).
 
-insert_opts(_DB,_Id,[]) -> done;
-insert_opts(DB,Id,[Opt|Opts]) ->
-    insert_opt(DB,Id,Opt),
-    insert_opts(DB,Id,Opts).
+insert_opt(Id, {default, ObjType, Opt}) -> insert_def(Id, ObjType, Opt);
+insert_opt(#gstkid{id = Id}, Data) -> insert_opt(Id, Data);
+insert_opt(Id, {Key, Val}) -> ets:insert(get(options), {{Id, Key}, Val}).
 
-insert_def(#gstkid{id=ID},ObjType,{Key,Val}) ->
-    insert_def(ID,ObjType,{Key,Val});
-insert_def(ID,ObjType,{Key,Val}) ->
+insert_opts(DB, Id, Opts) when is_list(Opts) ->
+    lists:foreach(fun(Opt) -> insert_opt(DB, Id, Opt) end, Opts),
+    done.
+
+insert_def(#gstkid{id = ID}, ObjType, Data) -> insert_def(ID, ObjType, Data);
+insert_def(ID, ObjType, {Key, _} = Data) ->
     Def = get(defaults),
-    ets:match_delete(Def,{{ID,ObjType},{Key,'_'}}),
-    ets:insert(Def,{{ID,ObjType},{Key,Val}}).
+    K = {ID, ObjType},
+    ets:match_delete(Def, {K, {Key, '_'}}),
+    ets:insert(Def, {K, Data}).
 
-lookup_def(ID,ObjType,Key) ->
-    case ets:match(get(defaults),{{ID,ObjType},{Key,'$1'}}) of
+lookup_def(ID, ObjType, Key) ->
+    case ets:match(get(defaults), {{ID, ObjType}, {Key, '$1'}}) of
 	[] -> false;
-	[[Val]] -> {value,Val}
+	[[Val]] -> {value, Val}
     end.
 
-opt(DB,#gstkid{id=Id},Opt) -> opt(DB,Id,Opt);
-opt(_DB,Id,Opt) ->
-    [{_, Value}] = ets:lookup(get(options), {Id,Opt}),
+opt(_DB, Id, Opt) -> opt(Opt, Id).
+
+opt(Opt, #gstkid{id = Id}) -> opt(Opt, Id);
+opt(Opt, Id) ->
+    [{_, Value}] = ets:lookup(get(options), {Id, Opt}),
     Value.
 
-opt_or_not(DB,#gstkid{id=Id},Opt) -> opt_or_not(DB,Id,Opt);
-opt_or_not(_DB,Id,Opt) ->
-    case ets:lookup(get(options), {Id,Opt}) of
+opt_or_not(_DB, Id, Opt) -> opt_or_not(Opt, Id).
+
+opt_or_not(Opt, #gstkid{id = Id}) -> opt_or_not(Opt, Id);
+opt_or_not(Opt, Id) ->
+    case ets:lookup(get(options), {Id, Opt}) of
 	[{_, Value}] -> {value, Value};
 	_ -> false
     end.
 
-opt(DB,#gstkid{id=Id},Opt,ElseVal) -> opt(DB,Id,Opt,ElseVal);
-opt(_DB,Id,Opt,ElseVal) ->
-    case ets:lookup(get(options), {Id,Opt}) of
-	[{_, Value}] ->
-	    Value;
+opt(_DB, Id, Opt, ElseVal) -> opt4(ElseVal, Id, Opt).
+
+opt4(ElseVal, #gstkid{id = Id}, Opt) -> opt4(ElseVal, Id, Opt);
+opt4(ElseVal, Id, Opt) ->
+    case ets:lookup(get(options), {Id, Opt}) of
+	[{_, Value}] -> Value;
 	_ -> ElseVal
     end.
 
 %%----------------------------------------------------------------------
-%% Returns: list of {Key,Val}
+%% Returns: list of {Key, Val}
 %%----------------------------------------------------------------------
-default_container_opts(_DB,Id,ChildType) ->
-    L =	ets:match(get(defaults),{{Id,'$1'},'$2'}),
-    lists:sort(fix_def_for_container(L,ChildType)).
+default_container_opts(_DB, Id, ChildType) ->
+    lists:sort(fix_def_for_container(ets:match(get(defaults), {{Id, '$1'}, '$2'}), ChildType)).
 
-default_opts(_DB,Id,ChildType) ->
-    L1 = ets:lookup(get(defaults),{Id,ChildType}),
-    L2 = ets:lookup(get(defaults),{Id,all}),
-    lists:sort(fix_def(L1,L2)).
+default_opts(_DB, Id, ChildType) ->
+    D = get(defaults),
+    lists:sort(fix_def(ets:lookup(D, {Id, ChildType}), ets:lookup(D, {Id, all}))).
 
-fix_def([{_,Opt}|Opts],Opts2) ->
-    [Opt|fix_def(Opts,Opts2)];
-fix_def([],[]) -> [];
-fix_def([],Opts) ->
-    fix_def(Opts,[]).
+fix_def([{_, Opt}|Opts], Opts2) -> [Opt|fix_def(Opts, Opts2)];
+fix_def([], []) -> [];
+fix_def([], Opts) -> fix_def(Opts, []).
 
 %%----------------------------------------------------------------------
-%% Purpose: Extracs {default,ObjType,DefsultOpt} for the ChildType
+%% Purpose: Extracs {default, ObjType, DefsultOpt} for the ChildType
 %% and keeps default options since it is a container object.
 %% Returns: list of options
 %%----------------------------------------------------------------------
-fix_def_for_container([[all,{Key,Val}]|Opts],ChildType) ->
-    [{{default,all,Key},Val},{Key,Val}
-     |fix_def_for_container(Opts,ChildType)];
-fix_def_for_container([[ChildType,{Key,Val}]|Opts],ChildType) ->
-    [{{default,ChildType,Key},Val},{Key,Val}
-     |fix_def_for_container(Opts,ChildType)];
-fix_def_for_container([[ChildType2,{Key,Val}]|Opts],_ChildType) ->
-    [{{default,ChildType2,Key},Val}|fix_def_for_container(Opts,ChildType2)];
-fix_def_for_container([],_) -> [].
+fix_def_for_container(Defs, ChildType) ->
+    lists:foldr(fun([C, {Key, Val}], A) when C =/= all; C =/= ChildType -> [{{default, C, Key}, Val}|A];
+		   ([C, {Key, Val} = Data], A) -> [{{default, C, Key}, Val}, Data|A]
+		end, [], Defs).
 
 %% -----------------------------------------------------------------
 %%  lookup things
 
-lookup_gstkid(DB, Name, Owner) when is_atom(Name) ->
-    ID = lookup(DB, {Owner, Name}),
-    lookup(DB, ID);
-
-lookup_gstkid(DB, ID, _Owner) ->
-    lookup(DB, ID).
-
-
-lookup_gstkid(_DB, Name) when is_atom(Name) ->
-    exit({'must use owner',Name});
-
-lookup_gstkid(DB, ID) ->
-    lookup(DB, ID).
+lookup_gstkid(DB, Name, Owner) when is_atom(Name) -> lookup(DB, lookup(DB, {Owner, Name}));
+lookup_gstkid(DB, ID, _Owner) -> lookup(DB, ID).
 
+lookup_gstkid(_DB, Name) when is_atom(Name) -> exit({'must use owner', Name});
+lookup_gstkid(DB, ID) -> lookup(DB, ID).
 
-lookup_ids(DB, Pid) ->
-    ril(ets:match(DB, {'$1', {gstkid,'_','_','_',Pid,'_','_'}})).
+lookup_ids(DB, Pid) -> ril(ets:match(DB, {'$1', {gstkid, '_', '_', '_', Pid, '_', '_'}})).
 
 lookup_item(DB, TkW, Item) ->
-						%    [[Id]] = ets:match(DB, {'$1', {gstkid,'_',TkW, Item,'_','_','_'}}),
-						%    Id.
     %% OTP-4167 Gif images gstkids are stored differently from other objects
-    case ets:match(DB, {'$1', {gstkid,'_',TkW, Item,'_','_','_'}}) of
-	[[Id]] ->
-	    Id;
-	[] ->
-	    Pattern = {'$1', {gstkid,'_',TkW, {'_',Item},'_','_',image}},
-	    [[Id]] = ets:match(DB, Pattern),
-	    Id
-    end.
-
+    [[Id]] = case ets:match(DB, {'$1', {gstkid, '_', TkW, Item, '_', '_', '_'}}) of
+		 [] -> ets:match(DB, {'$1', {gstkid, '_', TkW, {'_', Item}, '_', '_', image}});
+		 ID -> ID
+	     end,
+    Id.
 
 %% -----------------------------------------------------------------
 %% counters
 
 counter(DB, Key) ->
-    Result =
-	case ets:lookup(DB, Key) of
-	    [{Key, Value}] -> Value+1;
-	    _ -> 0
-	end,
+    Result = case ets:lookup(DB, Key) of
+		 [{Key, Value}] -> Value + 1;
+		 _ -> 0
+	     end,
     ets:insert(DB, {Key, Result}),
     Result.
 
-
 %% -----------------------------------------------------------------
 %% delete things
 
-delete_widgets(DB, [ID | Rest]) ->
-    delete_widget(DB, ID),
-    delete_widgets(DB, Rest);
-delete_widgets(_, []) ->
+delete_widgets(DB, IDs) when is_list(IDs) ->
+    lists:foreach(fun(ID) -> delete_widget(DB, ID) end, IDs),
     true.
 
-
-delete_widget(DB, #gstkid{id = ID}) ->
-    delete_widget(DB, ID);
+delete_widget(DB, #gstkid{id = ID}) -> delete_widget(DB, ID);
 delete_widget(DB, ID) ->
     delete_widgets(DB, lookup_kids(DB, ID)),
     delete_id(DB, ID).
 
-delete_gstkid(DB,Gstkid) ->
-    delete_id(DB,Gstkid).
+delete_gstkid(DB, Gstkid) -> delete_id(DB, Gstkid).
 
 delete_id(DB, ID) ->
-    case lookup_gstkid(DB, ID) of
-	undefined ->
-	    true;
-	_Gstkid     ->
-	    gstk:worker_do({match_delete,[{get(options),[{{ID,'_'},'_'}]},
-					  {get(defaults),[{{ID,'_'},'_'}]}]}),
-	    ets:insert(get(deleted),{deleted,ID}),
-	    delete(DB, ID)
-    end,
+    lookup_gstkid(DB, ID) =:= undefined orelse begin
+					       gstk:worker_do({match_delete,
+							      [{get(options), [{{ID, '_'}, '_'}]},
+							       {get(defaults), [{{ID, '_'}, '_'}]}]}),
+					       ets:insert(get(deleted), {deleted, ID}),
+					       delete(DB, ID)
+					       end,
     ets:delete(get(kids), {kids, ID}),
     delete(get(events), {events, ID}),
     true.
 
-get_deleted(_DB) ->
+get_deleted(_DB) -> get_deleted().
+
+get_deleted() ->
     Dd = get(deleted),
-    R=fix_deleted(ets:lookup(Dd,deleted)),
-    ets:delete(Dd,deleted),
+    R = fix_deleted(ets:lookup(Dd, deleted)),
+    ets:delete(Dd, deleted),
     R.
 
-fix_deleted([{_,Id}|Dd]) ->
-    [Id | fix_deleted(Dd)];
-fix_deleted([]) -> [].
+fix_deleted(Db) ->
+    {_, Ids} = lists:unzip(Db),
+    Ids.
 
 %% -----------------------------------------------------------------
 %% odd stuff
 
 %% check if an event is in the database, used by read_option
-is_inserted(DB, #gstkid{id = ID}, What) ->
-    is_inserted(DB, ID, What);
-is_inserted(_DB, ID, What) ->
+is_inserted(_DB, ID, What) -> is_inserted(ID, What).
+
+is_inserted(#gstkid{id = ID}, What) -> is_inserted(ID, What);
+is_inserted(ID, What) ->
     case lookup(get(events), {events, ID}) of
 	undefined -> false;
-	Events -> 
-	    case lists:keysearch(What, 2, Events) of
-		{value, _} -> true;
-		_Other      -> false
-	    end
+	Events -> lists:keyfind(What, 2, Events) =/= false
     end.
 
 %% -----------------------------------------------------------------
@@ -406,8 +337,4 @@ is_inserted(_DB, ID, What) ->
 %% -----------------------------------------------------------------
 
 %% remove irritating lists
-ril([[Foo] | Rest]) -> [Foo | ril(Rest)];
-ril([]) -> [].
-
-
-
+ril(L) -> lists:map(fun([Foo]) -> Foo end, L).
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_editor.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_editor.erl
--- otp_src_19.0.5/lib/gs/src/gstk_editor.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_editor.erl	2016-08-25 16:37:44.562693392 +0300
@@ -24,16 +24,17 @@
 %% ------------------------------------------------------------
 
 -module(gstk_editor).
--compile([{nowarn_deprecated_function,{gs,assq,2}},
-          {nowarn_deprecated_function,{gs,error,2}},
-          {nowarn_deprecated_function,{gs,val,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, assq, 2}},
+          {nowarn_deprecated_function, {gs, error, 2}},
+          {nowarn_deprecated_function, {gs, val, 2}}]).
 
 %%------------------------------------------------------------------------------
 %% 			    CANVAS OPTIONS
 %%
 %%  Attributes:
 %%	activebg		Color
-%%	anchor			n,w,s,e,nw,se,ne,sw,center
+%%	anchor			n, w,s, e,nw, se, ne, sw, center
 %%	bc			Color
 %%	bg			Color
 %%	bw			Wth
@@ -47,7 +48,7 @@
 %%	hscroll			Bool | top | bottom
 %%	insertbg		Color
 %%	insertbw		Wth
-%%      insertpos               {Row,Col}|'end'  (Row: 1..Max, Col: 0..Max)
+%%      insertpos               {Row, Col}|'end'  (Row: 1..Max, Col: 0..Max)
 %%	justify			left|right|center
 %%	padx			Int   (Pixels)
 %%	pady			Int   (Pixels)
@@ -70,7 +71,7 @@
 %%	enable			Bool
 %%	file			String
 %%	get			{FromIdx, ToIdx} => Text
-%%	insert			{Index, Text}Index = [insert,{Row,lineend},end,{Row,Col}]
+%%	insert			{Index, Text}Index = [insert, {Row, lineend}, end, {Row, Col}]
 %%	setfocus		Bool
 %%
 %%  Events:
@@ -97,7 +98,7 @@
 % .t index end -> MaxRows.cols
 % .t yview moveto (Row-1)/MaxRows
 
--export([create/3, config/3, read/3, delete/2,event/5,option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -109,33 +110,22 @@
 %% Purpose    	: Create a widget of the type defined in this module.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, Gstkid, Opts) ->
-    MainW = gstk_generic:mk_tkw_child(DB,Gstkid),
-    Editor = lists:append(MainW,".z"),
+    MainW = gstk_generic:mk_tkw_child(DB, Gstkid),
+    Editor = lists:append(MainW, ".z"),
     {Vscroll, Hscroll, NewOpts} = gstk_generic:parse_scrolls(Opts),
-    WidgetD = #so{main=MainW, object=Editor,
-		 hscroll=Hscroll, vscroll=Vscroll,misc=[{1,white}]},
-    NGstkid=Gstkid#gstkid{widget=MainW, widget_data=WidgetD},
-    gstk_db:insert_widget(DB,NGstkid),
-    MandatoryCmd = ["so_create text ", MainW],
-    case gstk:call(MandatoryCmd) of
-	{result, _} ->
-	    SimplePreCmd = [MainW, " conf"],
-	    PlacePreCmd = [";place ", MainW],
-	    case gstk_generic:make_command(NewOpts, NGstkid, MainW, SimplePreCmd,
-					  PlacePreCmd, DB,Editor) of
-		{error,Reason} -> {error,Reason};
-		Cmd ->
-		    gstk:exec(Cmd),
-		    gstk:exec(
-		      [Editor," conf -bo 2 -relief sunken -highlightth 2;",
-		       MainW,".sy conf -rel sunken -bo 2;",
-		       MainW,".pad.sx conf -rel sunken -bo 2;",
-		       Editor, " tag co c1 -for white;"]),
-		    ok
-	    end
+    NGstkid = Gstkid#gstkid{widget = MainW, widget_data = #so{main = MainW, object = Editor,
+							      hscroll = Hscroll, vscroll = Vscroll,
+							      misc = [{1, white}]}},
+    gstk_db:insert_widget(DB, NGstkid),
+    {result, _} = gstk:call(["so_create text ", MainW]),
+    case gstk_generic:make_command(NewOpts, NGstkid, MainW, [MainW, " conf"], [";place ", MainW], DB, Editor) of
+	{error, _Reason} = E -> E;
+	Cmd -> lists:foreach(fun gstk:exec/1, [Cmd, [Editor, " conf -bo 2 -relief sunken -highlightth 2;",
+						     MainW, ".sy conf -rel sunken -bo 2;",
+						     MainW, ".pad.sx conf -rel sunken -bo 2;",
+						     Editor, " tag co c1 -for white;"]])
     end.
 
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
 %% Purpose    	: Configure a widget of the type defined in this module.
@@ -145,20 +135,12 @@ create(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Options) ->
-    SO = Gstkid#gstkid.widget_data,
-    MainW = Gstkid#gstkid.widget,
-    Editor = SO#so.object,
-    NewOpts =
-	case {gs:assq(vscroll,Options),gs:assq(hscroll,Options)} of
-	    {false,false} -> Options;
-	    _ -> gstk_generic:parse_scrolls(Gstkid, Options)
-	end,
-    SimplePreCmd = [MainW, " conf"],
-    PlacePreCmd = [";place ", MainW],
-    gstk_generic:mk_cmd_and_exec(NewOpts, Gstkid, MainW, SimplePreCmd,
-				PlacePreCmd, DB, Editor).
-
+config(DB, #gstkid{widget = MainW, widget_data = #so{object = Object}} = Gstkid, Options) ->
+    gstk_generic:mk_cmd_and_exec(case [gs:assq(E, Options) || E <- [vscroll, hscroll]] of
+				     [false, false] -> Options;
+				     _ -> gstk_generic:parse_scrolls(Gstkid, Options)
+				 end,
+				 Gstkid, MainW, [MainW, " conf"], [";place ", MainW], DB, Object).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -169,10 +151,7 @@ config(DB, Gstkid, Options) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    SO = Gstkid#gstkid.widget_data,
-    gstk_generic:read_option(DB, Gstkid, Opt,SO#so.object).
-
+read(DB, #gstkid{widget_data = #so{object = Object}} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, Object).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -182,13 +161,11 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    Gstkid#gstkid.widget.
-
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+    TkW.
 
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%-----------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -204,70 +181,66 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, _MainW, DB, Editor) ->
-    case Option of
-	{font,Font} when is_tuple(Font) ->   
-	    gstk_db:insert_opt(DB,Gstkid,Option),
-	    {c, [Editor, " conf -font ", gstk_font:choose_ascii(DB,Font)]};
-	{font_style, {{Start,End},Font}} -> % should be only style
-	    {Tag,Ngstkid} = get_style_tag(DB,Editor,Font,Gstkid),
-	    gstk_db:update_widget(DB,Ngstkid),
-	    {c, Ngstkid, [Editor, " tag ad ", Tag, " ", p_index(Start), " ",
-			 p_index(End)]};
-	{fg, {{Start,End},Color}} ->
-	    {Tag,Ngstkid} = get_color_tag(Editor,Color,Gstkid),
-	    gstk_db:update_widget(DB,Ngstkid),
-	    {c, Ngstkid, [Editor, " tag ad ", Tag, " ", p_index(Start), " ",
-			 p_index(End)]};
-	{padx,          Pad} -> {c, [Editor," conf -padx ",gstk:to_ascii(Pad)]};
-	{pady,          Pad} -> {c, [Editor," conf -pady ",gstk:to_ascii(Pad)]};
-	{selection, {From, To}} ->
-	    {c, [Editor," tag ad sel ",p_index(From)," ", p_index(To)]};
-	{vscrollpos, Row} ->
-	    {MaxRow,_Col} = ret_ed_index([Editor," ind end"]),
-	    {c, [Editor, " yv mo ",gstk:to_ascii(Row/MaxRow)]};
-	{wrap,          How} ->
-	    {c, [Editor, " conf -wrap ", gstk:to_ascii(How)]};
-	{fg,          Color} ->
-	    {c, [Editor, " conf -fg ", gstk:to_color(Color)]};
-	{insertbw,      Wth} ->
-	    {c, [Editor, " conf -insertbo ", gstk:to_ascii(Wth)]};
-	{insertbg,    Color} ->
-	    {c, [Editor, " conf -insertba ", gstk:to_color(Color)]};
-	{insertpos,    Index} ->
-	    {c, [Editor, " m s insert ", p_index(Index)]};
-	{insert, {Index, Text}} ->
-	    {c, [Editor, " ins ", p_index(Index), " ", gstk:to_ascii(Text)]};
-	{del,      {From, To}} ->
-	    {c, [Editor, " del ", p_index(From), " ", p_index(To)]};
-	{overwrite, {Index, Text}} ->
-	    AI = p_index(Index),
-	    Len = gstk:to_ascii(lists:flatlength(Text)),
-	    {c, [Editor, " del ",AI," \"",AI,"+",Len,"c\";",
-		 Editor, " ins ",AI," ", gstk:to_ascii(Text)]};
-	clear       -> {c, [Editor, " delete 1.0 end"]};
-	{load,        File} ->
-	    F2 = re:replace(File, [92,92], "/", [global,{return,list}]),
-	    case gstk:call(["ed_load ", Editor, " ", gstk:to_ascii(F2)]) of
-		{result,    _} -> none;
-		{bad_result,Re} -> 
-		    {error,{no_such_file,editor,load,F2,Re}}
-	    end;
-	{save, File} ->
-	    F2 = re:replace(File, [92,92], "/", [global,{return,list}]),
-	    case gstk:call(["ed_save ",Editor," ",gstk:to_ascii(F2)]) of
-		{result,    _} -> none;
-		{bad_result,Re} -> 
-		    {error,{no_such_file,editor,save,F2,Re}}
-	    end;
-	{enable,      true} -> {c, [Editor, " conf -state normal"]};
-	{enable,     false} -> {c, [Editor, " conf -state disabled"]};
-	
-	{setfocus,     true} -> {c, ["focus ", Editor]};
-	{setfocus,    false} -> {c, ["focus ."]};
-	_ -> invalid_option
+option(Option, Gstkid, _MainW, DB, Editor) -> option(Option, Gstkid, Editor, DB).
+
+option({font, Font} = Option, Gstkid, Editor, DB) when is_tuple(Font) ->
+    gstk_db:insert_opt(DB, Gstkid, Option),
+    option_c(" conf -font ", gstk_font:choose_ascii(DB, Font), Editor);
+option({font_style, {{Start, End}, Font}}, Gstkid, Editor, DB) ->
+    option_tag(Start, End, Editor, DB, get_style_tag(Editor, Font, Gstkid, DB));
+option({fg, {{Start, End}, Color}}, Gstkid, Editor, DB) ->
+    option_tag(Start, End, Editor, DB, get_color_tag(Editor, Color, Gstkid));
+option(Option, _Gstkid, Editor, _DB) -> option(Option, Editor).
+
+option(clear, Editor) -> option_c(" delete 1.0 end", Editor);
+option({setfocus, true}, Editor) -> option_c(["focus ", Editor]);
+option({enable, false}, Editor) -> option_c(" conf -state disabled", Editor);
+option({padx, Pad}, Editor) -> to_ascii(" conf -padx ", Editor, Pad);
+option({pady, Pad}, Editor) -> to_ascii(" conf -pady ", Editor, Pad);
+option({wrap, How}, Editor) -> to_ascii(" conf -wrap ", Editor, How);
+option({insertbw, Wth}, Editor) -> to_ascii(" conf -insertbo ", Editor, Wth);
+option({insertbg, Color}, Editor) -> to_color(" conf -insertba ", Editor, Color);
+option({insertpos, Index}, Editor) -> option_c(" m s insert ", Editor, p_index(Index));
+option({load, File}, Editor) -> option_file("ed_load ", Editor, File, load);
+option({save, File}, Editor) -> option_file("ed_save ", Editor, File, save);
+option({insert, {Index, Text}}, Editor) -> option_index(" ins ", Editor, gstk:to_ascii(Text), Index);
+option({del, {From, To}}, Editor) -> option_range(" del ", Editor, From, To);
+option({vscrollpos, Row}, Editor) -> to_ascii(" yv mo ", Editor, Row / ret_ed_index(Editor, " ind end"));
+option({selection, {From, To}}, Editor) -> option_range(" tag ad sel ", Editor, From, To);
+option({overwrite, {Index, Text}}, Editor) ->
+    AI = p_index(Index),
+    option_c([Editor, " del ", AI, " \"", AI, "+", gstk:to_ascii(lists:flatlength(Text)), "c\";",
+	      Editor, " ins ", AI, " ", gstk:to_ascii(Text)]);
+option({fg, Color}, Editor) -> to_color(" conf -fg ", Editor, Color);
+option(Option, _Editor) -> option(Option).
+
+option({setfocus, false}) -> option_c(["focus ."]);
+option(_Option) -> invalid_option.
+
+option_c(Str, Editor) -> option_c([Editor, Str]).
+
+option_c(Str, Editor, Val) -> option_c([Editor, Str, Val]).
+
+option_c(L) -> {c, L}.
+
+option_range(Str, Editor, From, To) -> option_index(Str, Editor, From, p_index(To)).
+
+option_index(Str, Editor, Val, Index) -> option_c([Editor, Str, p_index(Index), " ", Val]).
+
+option_tag(Start, End, Editor, DB, {Tag, Ngstkid}) ->
+    gstk_db:update_widget(DB, Ngstkid),
+    {c, Ngstkid, [Editor, " tag ad ", Tag, " ", p_index(Start), " ", p_index(End)]}.
+
+option_file(Cmd, Editor, File, C) ->
+    F = re:replace(File, [92, 92], "/", [global, {return, list}]),
+    case gstk:call([Cmd, Editor, " ", gstk:to_ascii(F)]) of
+	{result, _} -> none;
+	{bad_result, Re} -> {error, {no_such_file, editor, C, F, Re}}
     end.
 
+to_ascii(Str, Editor, Val) -> option_c(Str, Editor, gstk:to_ascii(Val)).
+
+to_color(Str, Editor, Color) -> option_c(Str, Editor, gstk:to_color(Color)).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
@@ -275,75 +248,79 @@ option(Option, Gstkid, _MainW, DB, Edito
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,GstkId,_MainW,DB,Editor) ->
-    case Option of
-	font -> gstk_db:opt(DB,GstkId,font,undefined);
-	padx          -> tcl2erl:ret_atom([Editor," cg -padx"]);
-	pady          -> tcl2erl:ret_atom([Editor," cg -pady"]);
-	enable        -> tcl2erl:ret_enable([Editor," cg -st"]);
-	fg            -> tcl2erl:ret_color([Editor," cg -fg"]);
-	{fg, Pos} ->
-	    L=tcl2erl:ret_list([Editor," tag nam ", p_index(Pos)]),
-	    SO = GstkId#gstkid.widget_data,
-	    case last_tag_val(undefined, $c, L, SO#so.misc) of
-		undefined -> tcl2erl:ret_color([Editor," cg -fg"]);
-		Color -> Color
-	    end;
-	{font_style, Pos} ->
-	    L=tcl2erl:ret_list([Editor," tag nam ", p_index(Pos)]),
-	    SO = GstkId#gstkid.widget_data,
-	    case last_tag_val(undefined, $f, L, SO#so.misc) of
-		undefined -> 'my style? nyi';
-		Style -> Style
-	    end;
-	selection -> ret_ed_indexes([Editor," tag ne sel 1.0"]);
-	char_height   -> tcl2erl:ret_int([Editor, " cg -he"]);
-	char_width   -> tcl2erl:ret_int([Editor, " cg -wi"]);
-	insertbg      -> tcl2erl:ret_color([Editor," cg -insertba"]);
-	insertbw      -> tcl2erl:ret_int([Editor," cg -insertbo"]);
-	insertpos     -> ret_ed_index([Editor, " ind insert"]);
-	setfocus      -> tcl2erl:ret_focus(Editor, "focus");
-	wrap          -> tcl2erl:ret_atom([Editor," cg -wrap"]);
-	size          -> {MaxRow,_Col} = ret_ed_index([Editor," ind end"]),
-			 MaxRow-1;
-	vscrollpos       ->
-	    {MaxRow,_Col} = ret_ed_index([Editor," ind end"]),
-	    [Top,_Bot] = tcl2erl:ret_list([Editor," yvi"]),
-	    round(Top*(MaxRow-1))+1;
-	{get, {From, To}} ->
-	    tcl2erl:ret_str([Editor, " get ", p_index(From), " ", p_index(To)]);
-	_ -> {bad_result, {GstkId#gstkid.objtype, invalid_option, Option}}
-    end.
+read_option(Option, GstkId, _MainW, DB, Editor) -> read_option(Option, GstkId, Editor, DB).
+
+read_option(padx, _GstkId, Editor, _DB) -> ret_atom(Editor, " cg -padx");
+read_option(pady, _GstkId, Editor, _DB) -> ret_atom(Editor, " cg -pady");
+read_option(enable, _GstkId, Editor, _DB) -> tcl2erl:ret_enable([Editor, " cg -st"]);
+read_option(char_height, _GstkId, Editor, _DB) -> ret_int(Editor, " cg -he");
+read_option(char_width, _GstkId, Editor, _DB) -> ret_int(Editor, " cg -wi");
+read_option(insertbg, _GstkId, Editor, _DB) -> ret_color(Editor, " cg -insertba");
+read_option(insertbw, _GstkId, Editor, _DB) -> ret_int(Editor, " cg -insertbo");
+read_option(selection, _GstkId, Editor, _DB) -> ret_ed_indexes([Editor, " tag ne sel 1.0"]);
+read_option(insertpos, _GstkId, Editor, _DB) -> ret_ed_index(Editor, " ind insert");
+read_option(setfocus, _GstkId, Editor, _DB) -> tcl2erl:ret_focus(Editor, "focus");
+read_option(wrap, _GstkId, Editor, _DB) -> ret_atom(Editor, " cg -wrap");
+read_option(fg, _GstkId, Editor, _DB) -> ret_color(Editor, " cg -fg");
+read_option(size, _GstkId, Editor, _DB) -> ret_ed_index(Editor, " ind end") - 1;
+read_option(vscrollpos, _GstkId, Editor, _DB) ->
+    [Top, _Bot] = tcl2erl:ret_list([Editor, " yvi"]),
+    round(Top * (ret_ed_index(Editor, " ind end") - 1)) + 1;
+read_option({get, {From, To}}, _GstkId, Editor, _DB) ->
+    tcl2erl:ret_str([Editor, " get ", p_index(From), " ", p_index(To)]);
+read_option(font, GstkId, _Editor, DB) -> gstk_db:opt(DB, GstkId, font, undefined);
+read_option({fg, Pos}, #gstkid{widget_data = #so{misc = Misc}}, Editor, _DB) ->
+    case ret_pos(Pos, $c, Editor, Misc) of
+	undefined -> ret_color(Editor, " cg -fg");
+	Color -> Color
+    end;
+read_option({font_style, Pos}, #gstkid{widget_data = #so{misc = Misc}}, Editor, _DB) ->
+    case ret_pos(Pos, $f, Editor, Misc) of
+	undefined -> 'my style? nyi';
+	Style -> Style
+    end;
+read_option(Option, #gstkid{objtype = ObjType}, _Editor, _DB) -> {bad_result, {ObjType, invalid_option, Option}}.
 
+ret_atom(Editor, Str) -> tcl2erl:ret_atom([Editor, Str]).
+
+ret_color(Editor, Str) -> tcl2erl:ret_color([Editor, Str]).
+
+ret_int(Editor, Str) -> tcl2erl:ret_int([Editor, Str]).
+
+ret_ed_index(Editor, Str) ->
+    {MaxRow, _Col} = ret_ed_index([Editor, Str]),
+    MaxRow - 1.
+
+ret_pos(Pos, C, Editor, Misc) -> last_tag_val(undefined, C, tcl2erl:ret_list([Editor, " tag nam ", p_index(Pos)]), Misc).
 
 %%------------------------------------------------------------------------------
 %%			       PRIMITIVES
 %%------------------------------------------------------------------------------
 
-p_index({Line, lineend}) -> [$",gstk:to_ascii(Line), ".1 lineend",$"];
+p_index({Line, lineend}) -> [$", gstk:to_ascii(Line), ".1 lineend", $"];
 p_index({Line, Char}) -> [gstk:to_ascii(Line), $., gstk:to_ascii(Char)];
-p_index(insert)       -> "insert";
-p_index('end')        -> "end";
-p_index(Idx)          -> gs:error("bad index in editor: ~w~n",[Idx]),0.
+p_index(insert) -> "insert";
+p_index('end') -> "end";
+p_index(Idx) ->
+    gs:error("bad index in editor: ~w~n", [Idx]),
+    0.
 
 ret_ed_index(Cmd) ->
     case gstk:call(Cmd) of
-	{result, Val} ->
-	    case io_lib:fread("~d.~d", Val) of
-		{ok, [Row,Col], []} -> {Row, Col};
-		Other -> {bad_result, Other}
-	    end;
+	{result, Val} -> case io_lib:fread("~d.~d", Val) of
+			     {ok, [Row, Col], []} -> {Row, Col};
+			     Other -> {bad_result, Other}
+			 end;
 	Bad_result -> Bad_result
     end.
 
 ret_ed_indexes(Cmd) ->
     case gstk:call(Cmd) of
 	{result, ""} -> undefined;
-	{result, Val} ->
-	    case io_lib:fread("~d.~d ~d.~d", Val) of
-		{ok, [Row1,Col1,Row2,Col2], []} -> {{Row1, Col1}, {Row2,Col2}};
-		Other -> {bad_result, Other}
-	    end;
+	{result, Val} -> case io_lib:fread("~d.~d ~d.~d", Val) of
+			     {ok, [Row1, Col1, Row2, Col2], []} -> {{Row1, Col1}, {Row2, Col2}};
+			     Other -> {bad_result, Other}
+			 end;
 	Bad_result -> Bad_result
     end.
 
@@ -352,49 +329,26 @@ ret_ed_indexes(Cmd) ->
 %% Returns: {Tag text(), NewGstkId}
 %%----------------------------------------------------------------------
 %% The misc field of the so record is a list of {ColorNo, Color|Font|...}
-get_color_tag(Editor,Color,Gstkid) ->
-    SO = Gstkid#gstkid.widget_data,
-    Tags = SO#so.misc,
-    case lists:keysearch(Color, 2, Tags) of
-%	{value, {No, _}} -> {["c",gstk:to_ascii(No)], Gstkid};
-%	false -> % don't reuse tags, priority order spoils that
-	_Any ->
-	    {No,_} = lists:max(Tags),
-	    N=No+1,
-	    SO2 = SO#so{misc=[{N,Color}|Tags]},
-	    TagStr=["c",gstk:to_ascii(N)],
-	    gstk:exec([Editor," tag co ",TagStr," -for ", gstk:to_color(Color)]),
-	    {TagStr,Gstkid#gstkid{widget_data=SO2}}
-    end.
+get_color_tag(Editor, Color, Gstkid) -> get_tag(Editor, Color, Gstkid, [" -for ", gstk:to_color(Color)]).
 
-get_style_tag(DB,Editor,Style,Gstkid) ->
-    SO = Gstkid#gstkid.widget_data,
-    Tags = SO#so.misc,
-    case lists:keysearch(Style, 2, Tags) of
-%	{value, {No, _}} -> {["f",gstk:to_ascii(No)], Gstkid};
-%	false -> % don't reuse tags, priority order spoils that
-	_Any -> 
-	    {No,_} = lists:max(Tags),
-	    N=No+1,
-	    SO2 = SO#so{misc=[{N,Style}|Tags]},
-	    TagStr=["f",gstk:to_ascii(N)],
-	    gstk:exec([Editor," tag co ",TagStr," -font ",
-		      gstk_font:choose_ascii(DB,Style)]), % should be style only
-	    {TagStr,Gstkid#gstkid{widget_data=SO2}}
-    end.
+get_style_tag(Editor, Style, Gstkid, DB) ->
+    get_tag(Editor, Style, Gstkid, [" -font ", gstk_font:choose_ascii(DB, Style)]).
+
+get_tag(Editor, Type, #gstkid{widget_data = #so{misc = Tags} = SO} = Gstkid, L) ->
+    N = lists:max(proplists:get_keys(Tags)) + 1,
+    TagStr = ["c", gstk:to_ascii(N)],
+    gstk:exec([Editor, " tag co ", TagStr|L]),
+    {TagStr, Gstkid#gstkid{widget_data = SO#so{misc = [{N, Type}|Tags]}}}.
 
 %%----------------------------------------------------------------------
 %% Purpose: Given a list of tags for a char, return its visible color
 %% (that is that last color tag in the list).
 %%----------------------------------------------------------------------
 last_tag_val(TagVal, _Chr, [], _TagDict) -> TagVal;
-last_tag_val(TagVal, Chr, [Tag|Ts],TagDict) ->
-    case atom_to_list(Tag) of
-	[Chr|ANo] ->
-	    No = list_to_integer(ANo),
-	    last_tag_val(gs:val(No, TagDict),Chr,Ts,TagDict);
-	_NoAcolor ->
-	    last_tag_val(TagVal,Chr, Ts,TagDict)
-    end.
-    
+last_tag_val(TagVal, Chr, [Tag|Ts], TagDict) ->
+    last_tag_val(case atom_to_list(Tag) of
+		     [Chr|No] -> gs:val(list_to_integer(No), TagDict);
+		     _NoAcolor -> TagVal
+		 end, Chr, Ts, TagDict).
+
 %%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_entry.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_entry.erl
--- otp_src_19.0.5/lib/gs/src/gstk_entry.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_entry.erl	2016-08-25 16:37:44.562693392 +0300
@@ -24,13 +24,14 @@
 %% ------------------------------------------------------------
 
 -module(gstk_entry).
--compile([{nowarn_deprecated_function,{gs,error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, error, 2}}]).
 
 %%------------------------------------------------------------------------------
 %% 			    ENTRY OPTIONS
 %%
 %%  Attributes:
-%%	anchor			n,w,s,e,nw,se,ne,sw,center
+%%	anchor			n, w,s, e,nw, se, ne, sw, center
 %%	bg			Color
 %%	bw			Int
 %%	data			Data
@@ -56,7 +57,7 @@
 %%  Commands:
 %%	delete			Index | {From, To}
 %%	enable			Bool
-%%	insert			{index,String}
+%%	insert			{index, String}
 %%	select			{From, To} | clear
 %%	setfocus		Bool
 %%
@@ -89,7 +90,7 @@
 %%	state			??????
 %%
 
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -101,19 +102,16 @@
 %% Purpose    	: Create a widget of the type defined in this module.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, GstkId, Opts) ->
-    TkW = gstk_generic:mk_tkw_child(DB,GstkId),
-    PlacePreCmd = [";place ", TkW],
-    Ngstkid = GstkId#gstkid{widget=TkW},
-    case gstk_generic:make_command(Opts,Ngstkid,TkW,"", PlacePreCmd,DB) of
-	{error,Reason} -> {error,Reason};
+    TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+    Ngstkid = GstkId#gstkid{widget = TkW},
+    case gstk_generic:make_command(Opts, Ngstkid, TkW, "", [";place ", TkW], DB) of
+	{error, _Reason} = E -> E;
 	Cmd when is_list(Cmd) ->
-	    case gstk:call(["entry ", TkW,Cmd]) of
+	    case gstk:call(["entry ", TkW, Cmd]) of
 		{result, _} ->
-		    gstk:exec(
-		      [TkW," conf -bo 2 -relief sunken -highlightth 2;"]),
+		    gstk:exec([TkW, " conf -bo 2 -relief sunken -highlightth 2;"]),
 		    Ngstkid;
-		Bad_Result ->
-		    {error, Bad_Result}
+		Bad_Result -> {error, Bad_Result}
 	    end
     end.
 
@@ -127,11 +125,8 @@ create(DB, GstkId, Opts) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    TkW = Gstkid#gstkid.widget,
-    SimplePreCmd = [TkW, " conf"],
-    PlacePreCmd = [";place ", TkW],
-    gstk_generic:mk_cmd_and_exec(Opts,Gstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+    gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -142,8 +137,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    gstk_generic:read_option(DB, Gstkid, Opt).
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -154,14 +148,11 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    Gstkid#gstkid.widget.
-
-
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+    TkW.
 
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%------------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -176,29 +167,38 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
-    case Option of
-	{font,    Font} ->
-	    gstk_db:insert_opt(DB,Gstkid,Option),
-	    {s, [" -font ", gstk_font:choose_ascii(DB,Font)]};
-	{insertbg,    Color} -> {s, [" -insertba ", gstk:to_color(Color)]};
-	{insertbw,    Width} -> {s, [" -insertbo ", gstk:to_ascii(Width)]};
-	{justify,       How} -> {s, [" -ju ", gstk:to_ascii(How)]};
-	{text,          Str} ->
-	    {c, [TkW," del 0 end; ",TkW," ins 0 ", gstk:to_ascii(Str)]};
-	{xselection,   Bool} -> {s, [" -exportse ", gstk:to_ascii(Bool)]};
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
 
-	{delete, {From, To}} ->
-	    {c, [TkW, " del ", p_index(From), $ , p_index(To)]};
-	{delete,      Index} -> {c, [TkW, " de ", p_index(Index)]};
-	{insert, {Idx, Str}} ->
-	    {c, [TkW, " ins ", gstk:to_ascii(Idx),$ , gstk:to_ascii(Str)]};
-	{select,      clear} -> {c, [TkW, " sel clear"]};
-	{select, {From, To}} ->
-	    {c, [TkW, " sel range ", p_index(From), $ , p_index(To)]};
-	_                    -> invalid_option
-    
-    end.
+option({font, Font} = Option, Gstkid, _TkW, DB) ->
+    gstk_db:insert_opt(DB, Gstkid, Option),
+    option_s(gstk_font:choose_ascii(DB, Font), " -font ");
+option(Option, _Gstkid, TkW, _DB) -> option(Option, TkW).
+
+option({select, clear}, TkW) -> option_c([TkW, " sel clear"]);
+option({text, Str}, TkW) -> option_c([TkW, " del 0 end; ", TkW, " ins 0 ", gstk:to_ascii(Str)]);
+option({delete, {From, To}}, TkW) -> option_range(" del ", TkW, From, To);
+option({delete, Index}, TkW) -> option_c([TkW, " de ", p_index(Index)]);
+option({select, {From, To}}, TkW) -> option_range(" sel range ", TkW, From, To);
+option({insert, {Idx, Str}}, TkW) -> option_c(" ins ", TkW, gstk:to_ascii(Idx), gstk:to_ascii(Str));
+option(Option, _TkW) -> option(Option).
+
+option({insertbg, Color}) -> option_s(gstk:to_color(Color), " -insertba ");
+option({insertbw, Width}) -> to_ascii(Width, " -insertbo ");
+option({justify, How}) -> to_ascii(How, " -ju ");
+option({xselection, Bool}) -> to_ascii(Bool, " -exportse ");
+option(_Option) -> invalid_option.
+
+option_c(L) -> {c, L}.
+
+option_c(Str, TkW, Val1, Val2) -> option_c([TkW, Str, Val1, $ , Val2]).
+
+option_range(Str, TkW, From, To) -> option_c(Str, TkW, p_index(From), p_index(To)).
+
+option_s(L) -> {s, L}.
+
+option_s(Val, Str) -> option_s([Str, Val]).
+
+to_ascii(Val, Str) -> option_s(gstk:to_ascii(Val), Str).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
@@ -210,25 +210,27 @@ option(Option, Gstkid, TkW, DB,_) ->
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid,TkW,DB,_) -> 
-    case Option of
-	insertbg      -> tcl2erl:ret_color([TkW," cg -insertba"]);
-	insertbw      -> tcl2erl:ret_int([TkW," cg -insertbo"]);
-	font -> gstk_db:opt(DB,Gstkid,font,undefined);
-	justify       -> tcl2erl:ret_atom([TkW," cg -jus"]);
-	text          -> tcl2erl:ret_str([TkW," get"]);
-	xselection    -> tcl2erl:ret_bool([TkW," cg -exports"]);
-	{index, Idx}  -> tcl2erl:ret_int([TkW, "cg ind ", p_index(Idx)]);
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
-    end.
+read_option(font, Gstkid, _TkW, DB, _) -> read_option(font, Gstkid, _TkW, DB).
+
+read_option(font, Gstkid, _TkW, DB) -> gstk_db:opt(DB, Gstkid, font, undefined);
+read_option(Option, Gstkid, TkW, _DB) -> read_option(Option, Gstkid, TkW).
+
+read_option(insertbg, _Gstkid, TkW) -> tcl2erl:ret_color([TkW, " cg -insertba"]);
+read_option(insertbw, _Gstkid, TkW) -> tcl2erl:ret_int([TkW, " cg -insertbo"]);
+read_option(justify, _Gstkid, TkW) -> tcl2erl:ret_atom([TkW, " cg -jus"]);
+read_option(text, _Gstkid, TkW) -> tcl2erl:ret_str([TkW, " get"]);
+read_option(xselection, _Gstkid, TkW) -> tcl2erl:ret_bool([TkW, " cg -exports"]);
+read_option({index, Idx}, _Gstkid, TkW) -> tcl2erl:ret_int([TkW, "cg ind ", p_index(Idx)]);
+read_option(Option, #gstkid{objtype = ObjType}, _TkW) -> {bad_result, {ObjType, invalid_option, Option}}.
 
 %%------------------------------------------------------------------------------
 %%			       PRIMITIVES
 %%------------------------------------------------------------------------------
 p_index(Index) when is_integer(Index) -> gstk:to_ascii(Index);
 p_index(insert) -> "insert";
-p_index(last)   -> "end";
-p_index(Idx)    -> gs:error("Bad index in entry: ~w~n",[Idx]),0.
-
+p_index(last) -> "end";
+p_index(Idx) ->
+    gs:error("Bad index in entry: ~w~n", [Idx]),
+    0.
 
 %%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk.erl
--- otp_src_19.0.5/lib/gs/src/gstk.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk.erl	2016-08-25 16:37:44.562693392 +0300
@@ -21,8 +21,9 @@
 %%
 
 -module(gstk).
--compile([{nowarn_deprecated_function,{gs,assq,2}},
-          {nowarn_deprecated_function,{gs,creation_error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, assq, 2}},
+          {nowarn_deprecated_function, {gs, creation_error, 2}}]).
 
 -export([start_link/4,
 	 stop/1,
@@ -48,142 +49,116 @@
 
 -include("gstk.hrl").
 
-start_link(GsId,FrontendNode,Owner,Options) ->
-    case gs:assq(node,Options) of
+start_link(GsId, FrontendNode, Owner, Options) ->
+    case gs:assq(node, Options) of
 	false ->
-	    Gstk = spawn_link(gstk, init,[{GsId, FrontendNode, Owner, Options}]),
+	    Gstk = spawn_link(gstk, init, [{GsId, FrontendNode, Owner, Options}]),
 	    receive
-		{ok, _PortHandler} ->
-		    {ok, Gstk};
-		{error, Reason} ->
-		    {error, Reason}
+		{ok, _PortHandler} -> {ok, Gstk};
+		{error, _Reason} = E -> E
 	    end;
-	{value, Node} ->
-	    rpc:call(Node,gen_server,start_link,[gstk, {Owner,Options},[]])
+	{value, Node} -> rpc:call(Node, gen_server, start_link, [gstk, {Owner, Options}, []])
     end.
 
-stop(BackendServ) -> 
-    request(BackendServ,stop).
-
-create(BackendServ,Args) ->
-    request(BackendServ,{create,Args}).
-
-config(BackendServ,Args) ->
-    request(BackendServ,{config,Args}).
-
-read(BackendServ,Args) ->
-    request(BackendServ,{read,Args}).
+stop(BackendServ) -> request(BackendServ, stop).
 
-destroy(BackendServ,Args) ->
-    request(BackendServ,{destroy,Args}).
+-define(REQUEST(N), N(BackendServ, Args) -> request(BackendServ, {N, Args})).
 
-pid_died(BackendServ,Pid) ->
-    request(BackendServ,{pid_died,Pid}).
+?REQUEST(create).
+?REQUEST(config).
+?REQUEST(read).
+?REQUEST(destroy).
+?REQUEST(pid_died).
 
-call(Cmd) ->
-    %%io:format("Call:~p~n",[Cmd]),
-    gstk_port_handler:call(get(port_handler),Cmd).
+call(Cmd) -> gstk_port_handler:call(get(port_handler), Cmd).
 
-exec(Cmd) ->
-    gstk_port_handler:exec(Cmd). 
+exec(Cmd) -> gstk_port_handler:exec(Cmd). 
 
 make_extern_id(IntId, DB) ->
-    [{_,Node}] = ets:lookup(DB,frontend_node),
-    {IntId,Node}.
+    [{_, Node}] = ets:lookup(DB, frontend_node),
+    {IntId, Node}.
 
-event(BackendServ,Event) ->
-    BackendServ!{event,Event}.
+event(BackendServ, Event) -> BackendServ ! {event, Event}.
 
 %% -----------------------------------------------------------------------------
 
-request(Who,Msg) ->
-    Who ! {self(),Msg},
+request(Who, Msg) ->
+    Who ! {self(), Msg},
     receive
-	{gstk_reply,R} -> R;
-	{'EXIT',Who,Reason} ->
-	    self() ! {'EXIT',Who,Reason},
-	    {error,Reason}
+	{gstk_reply, R} -> R;
+	{'EXIT', Who, Reason} = E ->
+	    self() ! E,
+	    {error, Reason}
     end.
 
-
--record(state,{db,frontendnode,port_handler}).
+-record(state, {db, frontendnode, port_handler}).
 
 %% ------------------------------------------------------------
 %% Initialize
 %%
-init({GsId,FrontendNode,Owner,Opts}) ->
-    put(gs_frontend,Owner),
+init({GsId, FrontendNode, Owner, Opts}) ->
+    put(gs_frontend, Owner),
     case gstk_port_handler:start_link(self()) of
-	{error, Reason} ->
-	    FrontendNode ! {error, Reason},
+	{error, _Reason} = E ->
+	    FrontendNode ! E,
 	    exit(normal);
-	{ok, PortHandler} ->
-	    FrontendNode ! {ok, PortHandler},
-	    put(port_handler,PortHandler),
-	    {ok,Port} = gstk_port_handler:ping(PortHandler),
-	    put(port,Port),
+	{ok, PortHandler} = R ->
+	    FrontendNode ! R,
+	    put(port_handler, PortHandler),
+	    {ok, Port} = gstk_port_handler:ping(PortHandler),
+	    put(port, Port),
 	    exec("wm withdraw ."),
 	    DB = gstk_db:init(Opts),
-	    ets:insert(DB,{frontend_node,FrontendNode}),
-	    put(worker,spawn_link(gstk,worker_init,[0])),
-	    Gstkid = #gstkid{id=GsId,widget="",owner=Owner,objtype=gs},
-	    gstk_db:insert_gs(DB,Gstkid),
+	    ets:insert(DB, {frontend_node, FrontendNode}),
+	    put(worker, spawn_link(gstk, worker_init, [0])),
+	    Gstkid = #gstkid{id = GsId, widget="", owner = Owner, objtype = gs},
+	    gstk_db:insert_gs(DB, Gstkid),
 	    gstk_font:init(),
-	    loop(#state{db=DB,frontendnode=FrontendNode})
+	    loop(#state{db = DB, frontendnode = FrontendNode})
     end.
 
 loop(State) ->
     receive
-	X ->
-	    case (doit(X,State)) of
-		done -> loop(State);
-		stop -> bye
-	    end
+	X -> case (doit(X, State)) of
+		 done -> loop(State);
+		 stop -> bye
+	     end
     end.
 
-reply(To,Msg) ->
-    To ! {gstk_reply,Msg},
+reply(To, Msg) ->
+    To ! {gstk_reply, Msg},
     done.
 
-doit({From,{config, {Id, Opts}}},#state{db=DB}) ->
-    reply(From,config_impl(DB,Id,Opts));
-doit({From,{create, Args}}, #state{db=DB}) ->
-    reply(From,create_impl(DB,Args));
-doit({From,{read,{Id,Opt}}},#state{db=DB}) ->
-    reply(From,read_impl(DB,Id,Opt));
-doit({From,{pid_died, Pid}}, #state{db=DB}) ->
+doit({From, {config, {Id, Opts}}}, #state{db = DB}) -> reply(From, config_impl(DB, Id, Opts));
+doit({From, {create, Args}}, #state{db = DB}) -> reply(From, create_impl(DB, Args));
+doit({From, {read, {Id, Opt}}}, #state{db = DB}) -> reply(From, read_impl(DB, Id, Opt));
+doit({From, {pid_died, Pid}}, #state{db = DB}) ->
     pid_died_impl(DB, Pid),
-    reply(From,gstk_db:get_deleted(DB));
-doit({From,{destroy, Id}}, #state{db=DB}) ->
-    destroy_impl(DB, gstk_db:lookup_gstkid(DB,Id)),
-    reply(From,gstk_db:get_deleted(DB));
-
-doit({From,dump_db},State) ->
-    io:format("gstk_db:~p~n",[lists:sort(ets:tab2list(State#state.db))]),
-    io:format("events:~p~n",[lists:sort(ets:tab2list(get(events)))]),
-    io:format("options:~p~n",[lists:sort(ets:tab2list(get(options)))]),
-    io:format("defaults:~p~n",[lists:sort(ets:tab2list(get(defaults)))]),
-    io:format("kids:~p~n",[lists:sort(ets:tab2list(get(kids)))]),
-    reply(From,State);
-
-doit({From,stop},_State) ->
+    reply(From, gstk_db:get_deleted(DB));
+doit({From, {destroy, Id}}, #state{db = DB}) ->
+    destroy_impl(DB, gstk_db:lookup_gstkid(DB, Id)),
+    reply(From, gstk_db:get_deleted(DB));
+doit({From, dump_db}, #state{db = DB} = State) ->
+    io:format("gstk_db:~p~n", [lists:sort(ets:tab2list(DB))]),
+    lists:foreach(fun(E) -> io:format("~s:~p~n", [E, lists:sort(ets:tab2list(get(E)))]) end,
+		  [events, options, defaults, kids]),
+    reply(From, State);
+doit({From, stop}, _State) ->
     gstk_port_handler:stop(get(port_handler)),
-    exit(get(worker),kill),
-    reply(From,stopped),
+    exit(get(worker), kill),
+    reply(From, stopped),
     stop;
-
-doit({event,{Id, Etag, Args}},#state{db=DB}) ->
+doit({event, {Id, Etag, Args}}, #state{db = DB}) ->
     case gstk_db:lookup_event(DB, Id, Etag) of
-        {Etype, Edata} ->
-            Gstkid = gstk_db:lookup_gstkid(DB, Id),
-            apply(gstk_widgets:objmod(Gstkid),event,[DB,Gstkid,Etype,Edata,Args]);
-        _ -> true
-    end,
-    done.
-
+	{Etype, Edata} ->
+	    Gstkid = gstk_db:lookup_gstkid(DB, Id),
+	    apply(gstk_widgets:objmod(Gstkid), event, [DB, Gstkid, Etype, Edata, Args]),
+	    done;
+	_ -> done
+    end.
 
 %%----------------------------------------------------------------------
-%% Implementation of create,config,read,destroy
+%% Implementation of create, config, read, destroy
 %% Comment: In the gstk process there is not concept call 'name', only
 %%          pure oids. Names are stripped of by 'gs' and this simplifies
 %%          gstk a lot.
@@ -194,132 +169,105 @@ doit({event,{Id, Etag, Args}},#state{db=
 %%          necessary) exists.
 %%----------------------------------------------------------------------
 
-
 create_impl(DB, {Owner, {Objtype, Id, Parent, Opts}}) ->
-    Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
-    GstkId=#gstkid{id=Id,owner=Owner,parent=Parent,objtype=Objtype},
-    gstk_db:insert_opt(DB,Id,{data,[]}),
-    RealOpts=apply(gstk_widgets:objmod(Pgstkid),
-		   mk_create_opts_for_child,[DB,GstkId,Pgstkid,Opts]),
+    gstk_db:insert_opt(DB, Id, {data, []}),
     case gstk_widgets:type2mod(Objtype) of
-	{error,Reason} -> {error,Reason};
+	{error, _Reason} = E -> E;
 	ObjMod ->
-	    case apply(ObjMod, create, [DB, GstkId, RealOpts]) of
-		{bad_result, BR} ->
-		    gstk_db:delete_gstkid(DB,GstkId),
-		    gs:creation_error(GstkId,{bad_result, BR});
-		Ngstkid when is_record(Ngstkid,gstkid) ->
-		    gstk_db:insert_widget(DB, Ngstkid),
-		    ok;
-		{error,Reason} -> {error,Reason};
-		ok -> ok
-	    end
+	    Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
+	    GstkId = #gstkid{id = Id, owner = Owner, parent = Parent, objtype = Objtype},
+	    case apply(ObjMod, create,
+			     [DB, GstkId, apply(gstk_widgets:objmod(Pgstkid), mk_create_opts_for_child,
+						[DB, GstkId, Pgstkid, Opts])]) of
+		      {bad_result, _} = BR ->
+			  gstk_db:delete_gstkid(DB, GstkId),
+			  gs:creation_error(GstkId, BR);
+		      #gstkid{} = Ngstkid ->
+			  gstk_db:insert_widget(DB, Ngstkid),
+			  ok;
+		      {error, _Reason} = E -> E;
+		      ok -> ok
+		  end
     end.
 
-config_impl(DB,Id,Opts) ->
-    Gstkid = gstk_db:lookup_gstkid(DB, Id), 
+config_impl(DB, Id, Opts) ->
+    Gstkid = gstk_db:lookup_gstkid(DB, Id),
     case apply(gstk_widgets:objmod(Gstkid), config, [DB, Gstkid, Opts]) of
 	ok -> ok;
-	{bad_result,R} -> {error,R};
-	{error,Reason} -> {error,Reason};
-	Q -> {error,Q}
+	{bad_result, R} -> {error, R};
+	{error, _Reason} = E -> E;
+	R -> {error, R}
     end.
 
-
-read_impl(DB,Id,Opt) ->
-    Gstkid = gstk_db:lookup_gstkid(DB, Id), 
+read_impl(DB, Id, Opt) ->
+    Gstkid = gstk_db:lookup_gstkid(DB, Id),
     case apply(gstk_widgets:objmod(Gstkid), read, [DB, Gstkid, Opt]) of
-	{bad_result,R} -> {error,R};
-	{error,R} -> {error,R};
-	Res -> Res
+	{bad_result, R} -> {error, R};
+	R -> R
     end.
 
-
-
 %%-----------------------------------------------------------------------------
 %%			DESTROYING A WIDGET
 %%-----------------------------------------------------------------------------
 
 destroy_impl(DB, Gstkid) ->
-    worker_do({delay_is,50}),
-    Widget = delete_only_this_widget(DB,Gstkid),
-    destroy_widgets([Widget], DB),
-    worker_do({delay_is,5}),
+    worker_do({delay_is, 50}),
+    destroy_widgets([delete_only_this_widget(DB, Gstkid)], DB),
+    worker_do({delay_is, 5}),
     true.
 
-delete_only_this_widget(DB,Gstkid) ->
-    #gstkid{id=ID,objtype=OT,parent=P} = Gstkid,
+delete_only_this_widget(DB, #gstkid{id = ID, objtype = OT, parent = P} = Gstkid) ->
     delete_widgets(gstk_db:lookup_kids(DB, ID), DB),
     Widget = apply(gstk_widgets:type2mod(OT), delete, [DB, Gstkid]),
     gstk_db:delete_kid(DB, P, ID),
     Widget.
 
-
 pid_died_impl(DB, Pid) ->
     case lists:sort(gstk_db:lookup_ids(DB, Pid)) of
-	[ID | IDs] ->
-	    Gstkid = gstk_db:lookup_gstkid(DB, ID),
-	    destroy_impl(DB, Gstkid),
-	    Tops = get_tops(IDs, DB),
-	    destroy_widgets(Tops, DB);
-	_ ->
-	    true
+	[ID|IDs] ->
+	    destroy_impl(DB, gstk_db:lookup_gstkid(DB, ID)),
+	    destroy_widgets(get_tops(IDs, DB), DB);
+	_ -> true
     end.
 
-
-get_tops([ID | IDs], DB) ->
+get_tops([ID|IDs], DB) ->
     case gstk_db:lookup_gstkid(DB, ID) of
-	undefined ->
-	    get_tops(IDs, DB);
-	Gstkid -> 
-	    Parent = Gstkid#gstkid.parent,
-	    case lists:member(Parent, IDs) of
-		true  ->
-		    delete_widgets([ID], DB),
-		    get_tops(IDs, DB);
-		false ->
-		    Widget = delete_only_this_widget(DB,Gstkid),
-		    [Widget | get_tops(IDs, DB)]
-	    end
+	undefined -> get_tops(IDs, DB);
+	#gstkid{parent = Parent} = Gstkid -> case lists:member(Parent, IDs) of
+						 true ->
+						     delete_widgets([ID], DB),
+						     get_tops(IDs, DB);
+						 false -> [delete_only_this_widget(DB, Gstkid)|get_tops(IDs, DB)]
+					     end
     end;
 get_tops([], _DB) -> [].
 
-
-delete_widgets([ID | Rest], DB) ->
+delete_widgets([ID|Rest], DB) ->
     delete_widgets(gstk_db:lookup_kids(DB, ID), DB),
     case gstk_db:lookup_gstkid(DB, ID) of
-	undefined ->
-	    delete_widgets(Rest, DB);
+	undefined -> delete_widgets(Rest, DB);
 	Gstkid ->
 	    apply(gstk_widgets:objmod(Gstkid), delete, [DB, Gstkid]),
 	    delete_widgets(Rest, DB)
     end;
 delete_widgets([], _) -> true.
 
-
-
 destroy_widgets(Widgets, DB) ->
     case destroy_wids(Widgets, DB) of
-	[]       -> true;
+	[] -> true;
 	Destroys -> exec(["destroy ", Destroys])
     end.
 
-
-destroy_wids([{Parent, ID, Objmod, Args} | Rest], DB) ->
+destroy_wids([{Parent, ID, Objmod, Args}|Rest], DB) ->
     gstk_db:delete_kid(DB, Parent, ID),
-    apply(Objmod, destroy, [DB | Args]),
+    apply(Objmod, destroy, [DB|Args]),
     destroy_wids(Rest, DB);
-
-destroy_wids([W | Rest], DB) ->
-    [W, " "| destroy_wids(Rest, DB)];
-
+destroy_wids([W|Rest], DB) -> [W, " "|destroy_wids(Rest, DB)];
 destroy_wids([], _DB) -> [].
 
-
 %% ----- The Color Model -----
 
-to_color({R,G,B}) ->
-    [$#,dec2hex(2,R),dec2hex(2,G),dec2hex(2,B)];
+to_color({R, G, B}) -> [$#, dec2hex(2, R), dec2hex(2, G), dec2hex(2, B)];
 to_color(Color) when is_atom(Color) -> atom_to_list(Color).
 
 %% ------------------------------------------------------------
@@ -327,63 +275,54 @@ to_color(Color) when is_atom(Color) -> a
 %% M is number of digits we want
 %% N is the decimal to be converted
 
-dec2hex(M,N) -> dec2hex(M,N,[]).
-
-dec2hex(0,_N,Ack) -> Ack;
-dec2hex(M,N,Ack) -> dec2hex(M-1,N bsr 4,[d2h(N band 15)|Ack]).
+dec2hex(M, N) -> dec2hex(M, N, []).
 
-d2h(N) when N<10 -> N+$0;
-d2h(N) -> N+$a-10.
+dec2hex(0, _N, Ack) -> Ack;
+dec2hex(M, N, Ack) -> dec2hex(M - 1, N bsr 4, [d2h(N band 2#1111)|Ack]).
 
+d2h(N) ->
+    N + if
+	    N < 10 -> $0;
+	    true -> $a - 10
+	end.
 
 %% ----- Value to String -----
 
-to_ascii(V) when is_list(V)    -> [$",to_ascii(V,[],[]),$"];  %% it's a string
+to_ascii(V) when is_list(V) -> [$", to_ascii(V, [], []), $"];  %% it's a string
 to_ascii(V) when is_integer(V) -> integer_to_list(V);
-to_ascii(V) when is_float(V)   -> float_to_list(V);
-to_ascii(V) when is_atom(V)    -> to_ascii( atom_to_list(V));
-to_ascii(V) when is_tuple(V)   -> to_ascii(lists:flatten(io_lib:format("~w",[V])));
-to_ascii(V) when is_pid(V)     -> pid_to_list(V).
+to_ascii(V) when is_float(V) -> float_to_list(V);
+to_ascii(V) when is_atom(V) -> to_ascii(atom_to_list(V));
+to_ascii(V) when is_tuple(V) -> to_ascii(lists:flatten(io_lib:format("~w", [V])));
+to_ascii(V) when is_pid(V) -> pid_to_list(V).
 
-						% FIXME: Currently we accept newlines in strings and handle this at
-						% the Tcl side. Is this the best way or should we translate to "\n"
-						% here?
-to_ascii([$[|R], Y, X) ->  to_ascii(R, Y, [$[, $\\ | X]);
-				    to_ascii([$]|R], Y, X) ->  to_ascii(R, Y, [$], $\\ | X]);
-to_ascii([${|R], Y, X) ->  to_ascii(R, Y, [${, $\\ | X]);
-				    to_ascii([$}|R], Y, X) ->  to_ascii(R, Y, [$}, $\\ | X]);
-to_ascii([$"|R], Y, X) ->  to_ascii(R, Y, [$", $\\ | X]);
-to_ascii([$$|R], Y, X) ->  to_ascii(R, Y, [$$, $\\ | X]);
-to_ascii([$\\|R], Y, X) ->  to_ascii(R, Y, [$\\, $\\ | X]);
+% FIXME: Currently we accept newlines in strings and handle this at
+% the Tcl side. Is this the best way or should we translate to "\n"
+% here?
 to_ascii([C|R], Y, X) when is_list(C) -> to_ascii(C, [R|Y], X);
+to_ascii([C|R], Y, X) when C =:= $[; C =:= $]; C =:= ${; C =:= $}; C =:= $"; C =:= $$; C =:= $\\ ->
+    to_ascii(R, Y, [C, $\\|X]);
 to_ascii([C|R], Y, X) -> to_ascii(R, Y, [C|X]);
 to_ascii([], [Y1|Y], X) -> to_ascii(Y1, Y, X);
 to_ascii([], [], X) -> lists:reverse(X).
 
-worker_do(Msg) ->
-    get(worker) ! Msg.
+worker_do(Msg) -> get(worker) ! Msg.
 
-worker_init(Delay) ->
-    receive
-	{delay_is,D} ->
-	    worker_init(D);
-	{match_delete,DBExprs} ->
-	    worker_match(DBExprs),
-	    if Delay > 0 ->
-		    receive
-			{delay_is,D} ->
-			    worker_init(D)
-		    after Delay ->
-			    worker_init(Delay)
-		    end;
-	       true -> 
-		    worker_init(Delay)
-	    end
-    end.
+worker_init(Delay) when Delay > 0 ->
+    worker_init(receive
+		    {delay_is, D} -> D;
+		    {match_delete, DBExprs} ->
+			worker_match(DBExprs),
+			if
+			    Delay > 0 -> receive
+					     {delay_is, D} -> D
+					 after Delay -> Delay
+					 end;
+			    true -> Delay
+			end
+		end).
 
-worker_match([{DB,[Expr|Exprs]}|DbExprs]) ->
-    ets:match_delete(DB,Expr),
-    worker_match([{DB,Exprs}|DbExprs]);
-worker_match([{_DB,[]}|DbExprs]) ->
-    worker_match(DbExprs);
+worker_match([{DB, [Expr|Exprs]}|DbExprs]) ->
+    ets:match_delete(DB, Expr),
+    worker_match([{DB, Exprs}|DbExprs]);
+worker_match([{_DB, []}|DbExprs]) -> worker_match(DbExprs);
 worker_match([]) -> done.
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_font.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_font.erl
--- otp_src_19.0.5/lib/gs/src/gstk_font.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_font.erl	2016-08-25 16:37:44.563693370 +0300
@@ -14,7 +14,7 @@
 %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 %% See the License for the specific language governing permissions and
 %% limitations under the License.
-%% 
+%%
 %% %CopyrightEnd%
 %%
 
@@ -41,16 +41,14 @@
 
 %-compile(export_all).
 
--export([init/0,choose_ascii/2,choose/2,width_height/3]).
-
+-export([init/0, choose_ascii/2, choose/2, width_height/3]).
 
 -ifndef(NEW_WIDTH_HEIGHT).
 init() ->
     %% hack. the only way to find the size of a text seems to be to put
     %% it into a label in an unmappen window (DummyFontWindow)
     gstk:exec("toplevel .dfw;wm withdraw .dfw;" %deiconify
-	     "label .dfw.l -text dummyinittxt -padx 0 -pady 0 -borderwidth 0;"
-	     "pack .dfw.l").
+	      "label .dfw.l -text dummyinittxt -padx 0 -pady 0 -borderwidth 0;pack .dfw.l").
 -else.
 init() -> true.
 -endif.
@@ -61,116 +59,81 @@ init() -> true.
 %%----------------------------------------------------------------------
 -ifndef(NEW_WIDTH_HEIGHT).
 width_height(_DB, FontSpec, Txt) ->
-    FontSpecStr = tk_font_spec(norm_font_spec(FontSpec)),
-    case gstk:call([".dfw.l co -font {", FontSpecStr,"}",
-		   " -text ", gstk:to_ascii(Txt)]) of
-	{result, _} ->
-	    Width = tcl2erl:ret_int("update idletasks;winfo w .dfw.l"),
-	    Height = tcl2erl:ret_int("winfo h .dfw.l"),
-%	    io:format("width_height(~p,~p) =>\n~p\n\n",[FontSpec,Txt,{Width,Height}]),
-	    {Width,Height};
-	_Bad_Result ->
-%	    io:format("width_height(~p,~p) =>\nundefined\n\n",[FontSpec,Txt]),
-	    undefined
+    case gstk:call([".dfw.l co -font {", tk_font_spec(norm_font_spec(FontSpec)), "}", " -text ", gstk:to_ascii(Txt)]) of
+	{result, _} -> {tcl2erl:ret_int("update idletasks;winfo w .dfw.l"), tcl2erl:ret_int("winfo h .dfw.l")};
+	_Bad_Result -> undefined
     end.
 -else.
 %% This code should work but does't. Tk gives incorrect
 %% values if asking to fast or something /kent
-width_height(DB, FontSpec, Txt) when tuple(FontSpec) ->
-    NormFontSpec = norm_font_spec(FontSpec),
+width_height(DB, FontSpec, Txt) when is_tuple(FontSpec) ->
+    {Family, _, Size} = NormFontSpec = norm_font_spec(FontSpec),
     FontSpecStr = tk_font_spec(NormFontSpec),
-    {Family,_,Size} = NormFontSpec,
-    LineHeight =
-	case cached_line_height(DB, {Family,Size}) of
-	    undefined ->
-		LineH = tcl2erl:ret_int(
-			  ["font metrics {",FontSpecStr,"} -linespace"]),
-		cache_line_height(DB, {Family,Size}, LineH),
-		LineH;
-	    LineH ->
-		LineH
-	end,
-    EscapedText = gstk:to_ascii(Txt),
-    Width = tcl2erl:ret_int(
-	      ["font measure {",FontSpecStr,"} ",EscapedText]),
-    Height = LineHeight * line_count(Txt),
-    {Width,Height};
-
-width_height(_DB, FontSpec, Txt) when list(FontSpec) ->
-    EscapedText = gstk:to_ascii(Txt),
-    Width =
-	tcl2erl:ret_int(["font measure {",FontSpec,"} ",EscapedText]),
-    LineHeight =
-	tcl2erl:ret_int(["font metrics {",FontSpec,"} -linespace"]),
-    Height = LineHeight * line_count(Txt),
-    {Width,Height}.
+    {tcl2erl:ret_int(["font measure {", FontSpecStr, "} ", gstk:to_ascii(Txt)]),
+     case cached_line_height(DB, {Family, Size}) of
+	 undefined ->
+	     LineH = tcl2erl:ret_int(["font metrics {", FontSpecStr, "} -linespace"]),
+	     cache_line_height(DB, {Family, Size}, LineH),
+	     LineH;
+	 LineH -> LineH
+     end * line_count(Txt)};
+width_height(_DB, FontSpec, Txt) when is_list(FontSpec) ->
+    {tcl2erl:ret_int(["font measure {", FontSpec, "} ", gstk:to_ascii(Txt)]),
+     tcl2erl:ret_int(["font metrics {", FontSpec, "} -linespace"]) * line_count(Txt)}.
 
-cached_line_height(DB,FontSpec) ->
-    gstk_db:lookup(DB, {cached_line_height,FontSpec}).
+cached_line_height(DB, FontSpec) -> gstk_db:lookup(DB, {cached_line_height, FontSpec}).
 
-cache_line_height(DB,FontSpec,Size) ->
-    gstk_db:insert(DB, {cached_line_height,FontSpec}, Size).
+cache_line_height(DB, FontSpec, Size) -> gstk_db:insert(DB, {cached_line_height, FontSpec}, Size).
 
-line_count(Line) ->
-    line_count(Line, 1).
+line_count(Line) -> line_count(Line, 1).
 
-line_count([H | T], Count) ->
-    Count + line_count(H, 0) + line_count(T, 0);
+line_count([H|T], Count) -> Count + line_count(H, 0) + line_count(T, 0);
 line_count($\n, Count) -> Count + 1;
-line_count(Char, Count) when integer(Char) -> Count;
+line_count(Char, Count) when is_integer(Char) -> Count;
 line_count([], Count) -> Count.
 -endif.
-    
-% "expr [font metrics ",FSpec," -linespace] * \
-% [regsub -all \\n ",Txt," {} ignore]"
+
+% "expr [font metrics ", FSpec, " -linespace] * \
+% [regsub -all \\n ", Txt, " {} ignore]"
 
 %%----------------------------------------------------------------------
 %% Returns: Font specification string in Tk format
 %%
-%% The input is {Family,Size} or {Family,Style,Size} where Family and
+%% The input is {Family, Size} or {Family, Style, Size} where Family and
 %% Style are atoms ?! FIXME true???
 %%----------------------------------------------------------------------
 choose_ascii(DB, Font) ->
-    {Fam,Styl,Siz} = choose(DB, Font),
-    {variable,V} =gstk_db:lookup(DB,{font,Fam,Styl,Siz}),
-%    io:format("choose_ascii(~p) =>\n~p\n\n",[Font,V]),
+    {Fam, Styl, Siz} = choose(DB, Font),
+    {variable, V} = gstk_db:lookup(DB, {font, Fam, Styl, Siz}),
     V.
 
-%% DB contains: {font,Fam,Style,Size} -> {replaced_by,{font,Fam,Style,Size}} or
+%% DB contains: {font, Fam, Style, Size} -> {replaced_by, {font, Fam, Style, Size}} or
 %%                            {variable, TkVariableStrInclDollar}
 
 %% ###########################################################################
 %%
 %% We create a new font name on the other side and store the name in the
 %% database. We reorder the options so that they have a predefined order.
-%% 
+%%
 %% ###########################################################################
 
-choose(DB, FontSpec) ->
-    choose_font(DB, norm_font_spec(FontSpec)).
+choose(DB, FontSpec) -> choose_font(DB, norm_font_spec(FontSpec)).
 
-choose_font(DB, {Fam,Styl,Siz}) ->
+choose_font(DB, {Fam, Styl, Siz}) ->
     Fam0 = map_family(Fam),
-    case gstk_db:lookup(DB,{font,Fam0,Styl,Siz}) of
-	{variable,_OwnFontName} -> true;
-	undefined -> 
-	    N = gstk_db:counter(DB,font),   % FIXME: Can use "font create"
-					    % without name to get unique name
-	    NewName=["f",gstk:to_ascii(N)],
-%	    io:format("~s\n\n",
-%		      [lists:flatten(["font create ",NewName," ",
-%				      tk_font_spec({Fam0,Styl,Siz})])]),
-	    gstk:exec(["font create ",NewName," ",
-		       tk_font_spec({Fam0,Styl,Siz})]),
+    FSS = {Fam0, Styl, Siz},
+    FFSS = {font, Fam0, Styl, Siz},
+    case gstk_db:lookup(DB, FFSS) of
+	{variable, _OwnFontName} -> FSS;
+	undefined ->
+	    % FIXME: Can use "font create" without name to get unique name
+	    NewName = ["f", gstk:to_ascii(gstk_db:counter(DB, font))],
+	    gstk:exec(["font create ", NewName, " ", tk_font_spec(FSS)]),
 	    %% should us variable syntax gs(f1) instead
 	    %% have to recompile erlcall to define this global gs var
-	    V2 = {variable,NewName},
-	    gstk_db:insert(DB,{font,Fam0,Styl,Siz},V2),
-	    true
-    end,
-%   io:format("choose(~p,~p,~p) =>\n~p\n\n",[Fam,Styl,Siz,{Fam0,Styl,Siz}]),
-    {Fam0,Styl,Siz}.
-
+	    gstk_db:insert(DB, FFSS, {variable, NewName}),
+	    FSS
+    end.
 
 %% ----- The Font Model -----
 
@@ -196,60 +159,35 @@ choose_font(DB, {Fam,Styl,Siz}) ->
 %%  scaled "tk scaling", we can display a 9 and 10 point helvetica
 %%  but "font actual {helvetica 9}" will return 10 points....
 
-map_family(new_century_schoolbook) ->
-    times;
-map_family(Fam) ->
-    Fam.
+map_family(new_century_schoolbook) -> times;
+map_family(Fam) -> Fam.
 
 % Normalize so can make the coding easier and compare font
 % specifications stored in database with new ones. We ignore invalid
 % entries in the list.
 
-norm_font_spec({Family,Size}) ->
-    {Family,[],Size};
-norm_font_spec({Family,Style,Size}) ->
-    {Family,norm_style(Style),Size}.
+norm_font_spec({Family, Size}) -> {Family, [], Size};
+norm_font_spec({Family, Style, Size}) -> {Family, norm_style(Style), Size}.
 
-norm_style(bold) ->
-    [bold];
-norm_style(italic) ->
-    [italic];
-norm_style([italic]) ->
-    [italic];
-norm_style([bold]) ->
-    [bold];
-norm_style([bold,italic] = Style) ->
-    Style;
-norm_style([italic,bold]) ->
-    [bold,italic];
-norm_style(List) when is_list(List) -> % not well formed list, ignore garbage
-    case {lists:member(bold, List),lists:member(italic, List)} of
-	{true,true} ->
-	    [bold,italic];
-	{true,_} ->
-	    [bold];
-	{_,true} ->
-	    [italic];
-	_ ->
-	    []			   % ignore garbage
+norm_style([italic, bold]) -> [bold, italic];
+norm_style(Style) when Style =:= italic; Style =:= bold -> [Style];
+norm_style(Style) when Style =:= [italic]; Style =:= [bold]; Style =:= [bold, italic] -> Style;
+norm_style([_|_] = List) -> % not well formed list, ignore garbage
+    Italic = lists:member(italic, List),
+    case lists:member(bold, List) of
+	true when Italic -> [bold, italic];
+	true -> [bold];
+	_ when Italic -> [italic];
+	_ -> [] % ignore garbage
     end;
-norm_style(_Any) ->		   % ignore garbage
-    [].
-
+norm_style(_Any) -> []. % ignore garbage
 
 % Create a tcl string from a normalized font specification  
 % The style list is normalized.
 
-tk_font_spec({Fam,Style,Size}) ->
-    ["-family ",gstk:to_ascii(Fam),
-     " -size ",gstk:to_ascii(-Size),
-     tk_font_spec_style(Style)].
+tk_font_spec({Fam, Style, Size}) ->
+    ["-family ", gstk:to_ascii(Fam), " -size ", gstk:to_ascii(-Size), tk_font_spec_style(Style)].
 
-tk_font_spec_style([]) ->
-    "";
-tk_font_spec_style([bold]) ->
-    " -weight bold";
-tk_font_spec_style([italic]) ->
-    " -slant italic";
-tk_font_spec_style([bold,italic]) ->
-    " -weight bold -slant italic".
+tk_font_spec_style([]) -> "";
+tk_font_spec_style([bold|T]) -> " -weight bold" ++ tk_font_spec_style(T);
+tk_font_spec_style([italic]) -> " -slant italic".
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_frame.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_frame.erl
--- otp_src_19.0.5/lib/gs/src/gstk_frame.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_frame.erl	2016-08-25 16:37:44.563693370 +0300
@@ -29,7 +29,7 @@
 %% 			    FRAME OPTIONS
 %%
 %%  Attributes:
-%%	anchor			n,w,s,e,nw,se,ne,sw,center
+%%	anchor			n, w,s, e,nw, se, ne, sw, center
 %%	bg			Color
 %%	bw			Int
 %%	data			Data
@@ -65,8 +65,7 @@
 %%	type
 %%
 
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5,
-	mk_create_opts_for_child/4]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5, mk_create_opts_for_child/4]).
 
 -include("gstk.hrl").
 
@@ -78,19 +77,17 @@
 %% Purpose    	: Create a widget of the type defined in this module.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, GstkId, Opts) ->
-    TkW = gstk_generic:mk_tkw_child(DB,GstkId),
-    NGstkid=GstkId#gstkid{widget=TkW},
-    PlacePreCmd = [";place ", TkW],
-    case gstk_generic:make_command(Opts, NGstkid, TkW, "", PlacePreCmd, DB) of
-	{error,Reason} -> {error,Reason};
+    TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+    NGstkid = GstkId#gstkid{widget = TkW},
+    case gstk_generic:make_command(Opts, NGstkid, TkW, "", [";place ", TkW], DB) of
+	{error, _Reason} = E -> E;
 	Cmd when is_list(Cmd) ->
-	    gstk:exec(["frame ", TkW,
-		      " -relief raised -bo 0",Cmd]),
+	    gstk:exec(["frame ", TkW, " -relief raised -bo 0", Cmd]),
 	    NGstkid
     end.
 
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
-    gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+    gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
@@ -101,27 +98,17 @@ mk_create_opts_for_child(DB,Cgstkid, Pgs
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    TkW = Gstkid#gstkid.widget,
-    SimplePreCmd = [TkW, " conf"],
-    PlacePreCmd = [";place ", TkW],
-    Opts2 = atomic_width_height(false,false,Opts),
-    gstk_generic:mk_cmd_and_exec(Opts2,Gstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+    gstk_generic:mk_cmd_and_exec(atomic_width_height(false, false, Opts),
+                                 Gstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
 
-atomic_width_height(false,false,[]) ->
-    [];
-atomic_width_height(false,Width,[]) ->
-    [{width,Width}];
-atomic_width_height(Height,false,[]) ->
-    [{height,Height}];
-atomic_width_height(H,W,[]) ->
-    [{width_height,{W,H}}];
-atomic_width_height(_,W,[{height,H}|Opts]) ->
-    atomic_width_height(H,W,Opts);
-atomic_width_height(H,_,[{width,W}|Opts]) ->
-    atomic_width_height(H,W,Opts);
-atomic_width_height(H,W,[Opt|Opts]) ->
-    [Opt|atomic_width_height(H,W,Opts)].
+atomic_width_height(false, false, []) -> [];
+atomic_width_height(false, Width, []) -> [{width, Width}];
+atomic_width_height(Height, false, []) -> [{height, Height}];
+atomic_width_height(H, W, []) -> [{width_height, {W, H}}];
+atomic_width_height(_, W, [{height, H}|Opts]) -> atomic_width_height(H, W, Opts);
+atomic_width_height(H, _, [{width, W}|Opts]) -> atomic_width_height(H, W, Opts);
+atomic_width_height(H, W, [Opt|Opts]) -> [Opt|atomic_width_height(H, W, Opts)].
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -132,9 +119,7 @@ atomic_width_height(H,W,[Opt|Opts]) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -144,13 +129,11 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    Gstkid#gstkid.widget.
-
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+    TkW.
 
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%-----------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -165,103 +148,82 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, _TkW, DB,_) ->
-    case Option of
-	{bg,          Color} -> {s, [" -bg ", gstk:to_color(Color)]};
-	{packer_x, _Pack} ->
-            gstk_db:insert_opt(DB,Gstkid,Option),
-	    none;
-	{packer_y, _Pack} ->
-	    gstk_db:insert_opt(DB,Gstkid,Option),
-	    none;
-	{width, W} ->
-	    execute_pack_cmds(DB,xpack(W,DB,Gstkid)),
-	    {s,[" -wi ", gstk:to_ascii(W)]};
-	{height, H} ->
-	    execute_pack_cmds(DB,ypack(H,DB,Gstkid)),
-	    {s,[" -he ", gstk:to_ascii(H)]};
-	{width_height,{W,H}} ->
-	    execute_pack_cmds(DB, merge_pack_cmds(xpack(W,DB,Gstkid),
-						  ypack(H,DB,Gstkid))),
-	    {s,[" -he ", gstk:to_ascii(H)," -wi ", gstk:to_ascii(W)]};
-	_  -> invalid_option
-    end.
+option(Option, Gstkid, _TkW, DB, _) -> option(Option, Gstkid, DB).
 
-xpack(W,DB,Gstkid) ->
-    gstk_db:insert_opt(DB,Gstkid,{width,W}),
-    case gstk_db:opt_or_not(DB,Gstkid,packer_x) of
-	{value,Pack} when is_list(Pack) ->
-	    ColSiz = gs_packer:pack(W,Pack),
-	    pack_children(pack_x,x,width,DB,
-			  gstk_db:lookup_kids(DB,Gstkid#gstkid.id),
-			  ColSiz);
-	_Else -> []
-    end.
+option({width, W}, Gstkid, DB) ->
+    execute_pack_cmds(DB, xpack(W, DB, Gstkid)),
+    to_ascii(" -wi ", W);
+option({height, H}, Gstkid, DB) ->
+    execute_pack_cmds(DB, ypack(H, DB, Gstkid)),
+    to_ascii(" -he ", H);
+option({width_height, {W, H}}, Gstkid, DB) ->
+    execute_pack_cmds(DB, merge_pack_cmds(xpack(W, DB, Gstkid), ypack(H, DB, Gstkid))),
+    option_s([" -he ", gstk:to_ascii(H), " -wi ", gstk:to_ascii(W)]);
+option({Packer, _Pack} = Option, Gstkid, DB) when Packer =:= packer_x; Packer =:= packer_y ->
+    gstk_db:insert_opt(DB, Gstkid, Option),
+    none;
+option(Option, _Gstkid, _DB) -> option(Option).
 
-ypack(H,DB,Gstkid) ->
-    gstk_db:insert_opt(DB,Gstkid,{height,H}),
-    case gstk_db:opt_or_not(DB,Gstkid,packer_y) of
-	{value,Pack} when is_list(Pack) ->
-	    ColSiz = gs_packer:pack(H,Pack),
-	    pack_children(pack_y,y,height,DB,
-			  gstk_db:lookup_kids(DB,Gstkid#gstkid.id),
-			  ColSiz);
+option({bg, Color}) -> option_s(" -bg ", gstk:to_color(Color));
+option(_Option) -> invalid_option.
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
+
+to_ascii(Str, Val) -> option_s(Str, gstk:to_ascii(Val)).
+
+xpack(W, DB, Gstkid) -> pack(W, DB, Gstkid, width, pack_x, packer_x, x).
+
+ypack(H, DB, Gstkid) -> pack(H, DB, Gstkid, height, pack_y, packer_y, y).
+
+pack(V, DB, Gstkid, Type, Pack, Packer, C) ->
+    gstk_db:insert_opt(DB, Gstkid, {Type, V}),
+    case gstk_db:opt_or_not(DB, Gstkid, Packer) of
+	{value, Pack} when is_list(Pack) -> pack_children(Pack, C, Type, DB,
+							  gstk_db:lookup_kids(DB, Gstkid#gstkid.id),
+							  gs_packer:pack(V, Pack));
 	_Else -> []
     end.
 
-merge_pack_cmds([{Id,Opts1}|Cmds1],[{Id,Opts2}|Cmds2]) ->
-    [{Id,Opts1++Opts2}|merge_pack_cmds(Cmds1,Cmds2)];
-merge_pack_cmds(L1,L2) ->
-    L1++L2.
+merge_pack_cmds([{Id, Opts1}|Cmds1], [{Id, Opts2}|Cmds2]) -> [{Id, Opts1 ++ Opts2}|merge_pack_cmds(Cmds1, Cmds2)];
+merge_pack_cmds(L1, L2) -> L1 ++ L2.
 
-execute_pack_cmds(DB,[{Id,Opts}|Cmds]) ->
-    gstk:config_impl(DB,Id,Opts),
-    execute_pack_cmds(DB,Cmds);
-execute_pack_cmds(_,[]) ->
-    ok.
+execute_pack_cmds(DB, [{Id, Opts}|Cmds]) ->
+    gstk:config_impl(DB, Id, Opts),
+    execute_pack_cmds(DB, Cmds);
+execute_pack_cmds(_, []) -> ok.
 
 %%----------------------------------------------------------------------
-%% Returns: list of {Id,Opts} to be executed (or merged with other first)
+%% Returns: list of {Id, Opts} to be executed (or merged with other first)
 %%----------------------------------------------------------------------
-pack_children(PackOpt,PosOpt,SizOpt,DB,Kids,Sizes) ->
-    Schildren = keep_packed(Kids,PackOpt,DB),
-    pack_children2(PackOpt,PosOpt,SizOpt,Schildren,Sizes).
+pack_children(PackOpt, PosOpt, SizOpt, DB, Kids, Sizes) ->
+    pack_children(PackOpt, PosOpt, SizOpt, keep_packed(Kids, PackOpt, DB), Sizes).
 
-pack_children2(PackOpt,PosOpt,SizOpt,[{StartStop,Id}|Childs],Sizes) ->
-    [pack_child(Id,StartStop,SizOpt,PosOpt,Sizes)
-     | pack_children2(PackOpt,PosOpt,SizOpt,Childs,Sizes)];
-pack_children2(_,_,_,[],_) ->
-    [].
+pack_children(PackOpt, PosOpt, SizOpt, [{StartStop, Id}|Childs], Sizes) ->
+    [pack_child(Id, StartStop, SizOpt, PosOpt, Sizes)|pack_children(PackOpt, PosOpt, SizOpt, Childs, Sizes)];
+pack_children(_, _, _, [], _) -> [].
 
-pack_child(Id,{StartPos,StopPos},SizOpt,PosOpt,Sizes) ->
-    {Pos,Size} = find_pos(StartPos,StopPos,1,0,0,Sizes),
-    {Id,[{PosOpt,Pos},{SizOpt,Size}]}.
+pack_child(Id, {StartPos, StopPos}, SizOpt, PosOpt, Sizes) ->
+    {Pos, Size} = find_pos(StartPos, StopPos, 1, 0, 0, Sizes),
+    {Id, [{PosOpt, Pos}, {SizOpt, Size}]}.
 
 %%----------------------------------------------------------------------
-%% Returns: {PixelPos,PixelSize}
+%% Returns: {PixelPos, PixelSize}
 %%----------------------------------------------------------------------
-find_pos(_StartPos,Pos,Pos,AccPixelPos,AccPixelSize,[Size|_]) ->
-    {AccPixelPos,Size+AccPixelSize};
-find_pos(StartPos,StopPos,Pos,AccPixelPos,0,[Size|Sizes])
-  when Pos < StartPos ->
-    find_pos(StartPos,StopPos,Pos+1,Size+AccPixelPos,0,Sizes);
-find_pos(_StartPos,StopPos,Pos,AccPixelPos,AccPixelSize,[Size|Sizes])
-  when Pos < StopPos ->
-    find_pos(Pos,StopPos,Pos+1,AccPixelPos,Size+AccPixelSize,Sizes).
-
-    
+find_pos(_StartPos, Pos, Pos, AccPixelPos, AccPixelSize, [Size|_]) -> {AccPixelPos, Size + AccPixelSize};
+find_pos(StartPos, StopPos, Pos, AccPixelPos, 0, [Size|Sizes]) when Pos < StartPos ->
+    find_pos(StartPos, StopPos, Pos + 1, Size + AccPixelPos, 0, Sizes);
+find_pos(_StartPos, StopPos, Pos, AccPixelPos, AccPixelSize, [Size|Sizes]) when Pos < StopPos ->
+    find_pos(Pos, StopPos, Pos + 1, AccPixelPos, Size + AccPixelSize, Sizes).
 
-keep_packed([Id|Ids],PackOpt,DB) ->
-    case gstk:read_impl(DB,Id,PackOpt) of
-	undefined ->
-	    keep_packed(Ids,PackOpt,DB);
-	StartStop ->
-	    [{StartStop,Id} | keep_packed(Ids,PackOpt,DB)]
+keep_packed([Id|Ids], PackOpt, DB) ->
+    KP = keep_packed(Ids, PackOpt, DB),
+    case gstk:read_impl(DB, Id, PackOpt) of
+	undefined -> KP;
+	StartStop -> [{StartStop, Id}|KP]
     end;
-keep_packed([],_,_) ->
-    [].
-    
-
+keep_packed([], _, _) -> [].
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/3
@@ -273,10 +235,9 @@ keep_packed([],_,_) ->
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid,TkW,_DB,_) -> 
-    case Option of
-	bg            -> tcl2erl:ret_color([TkW," cg -bg"]);
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
-    end.
+read_option(Option, Gstkid, TkW, _DB, _) -> read_option(Option, Gstkid, TkW).
+
+read_option(bg, _Gstkid, TkW) -> tcl2erl:ret_color([TkW, " cg -bg"]);
+read_option(Option, #gstkid{objtype = ObjType}, _TkW) -> {bad_result, {ObjType, invalid_option, Option}}.
 
 %% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_generic.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_generic.erl
--- otp_src_19.0.5/lib/gs/src/gstk_generic.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_generic.erl	2016-08-25 16:38:24.704337433 +0300
@@ -21,72 +21,45 @@
 %%
 
 -module(gstk_generic).
--compile([{nowarn_deprecated_function,{gs,assq,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, assq, 2}}]).
 
 -export([out_opts/8,
 	 read_option/5,
 	 mk_tkw_child/2,
-	 merge_default_options/3,
-	 merge_default_options/2,
+	 merge_default_options/2, merge_default_options/3,
 	 opts_for_child/3,
-	 mk_cmd_and_exec/4,
-	 mk_cmd_and_exec/5,
-	 mk_cmd_and_exec/6,
-	 mk_cmd_and_exec/7,
-	 make_command/5,
-	 make_command/6,
-	 make_command/7,
+	 mk_cmd_and_exec/4, mk_cmd_and_exec/5, mk_cmd_and_exec/6, mk_cmd_and_exec/7,
+	 make_command/5, make_command/6, make_command/7,
 	 read_option/4,
 	 handle_external_opt_call/9,
 	 handle_external_read/1,
-	 gen_anchor/9,
-	 gen_anchor/5,
-	 gen_height/9,
-	 gen_height/5,
-	 gen_width/9,
-	 gen_width/5,
-	 gen_x/9,
-	 gen_x/5,
-	 gen_y/9,
-	 gen_y/5,
-	 gen_raise/9,
-	 gen_raise/5,
-	 gen_lower/9,
-	 gen_lower/5,
-	 gen_enable/9,
-	 gen_enable/5,
-	 gen_align/9,
-	 gen_align/5,
-	 gen_justify/9,
-	 gen_justify/5,
-	 gen_padx/9,
-	 gen_padx/5,
-	 gen_pady/9,
-	 gen_pady/5,
-	 gen_font/9,
-	 gen_font/5,
-	 gen_label/9,
-	 gen_label/5,
-	 gen_activebg/9,
-	 gen_activebg/5,
-	 gen_activefg/9,
-	 gen_activefg/5,
+	 gen_anchor/9, gen_anchor/5,
+	 gen_height/9, gen_height/5,
+	 gen_width/9, gen_width/5,
+	 gen_x/9, gen_x/5,
+	 gen_y/9, gen_y/5,
+	 gen_raise/9, gen_raise/5,
+	 gen_lower/9, gen_lower/5,
+	 gen_enable/9, gen_enable/5,
+	 gen_align/9, gen_align/5,
+	 gen_justify/9, gen_justify/5,
+	 gen_padx/9, gen_padx/5,
+	 gen_pady/9, gen_pady/5,
+	 gen_font/9, gen_font/5,
+	 gen_label/9, gen_label/5,
+	 gen_activebg/9, gen_activebg/5,
+	 gen_activefg/9, gen_activefg/5,
 	 gen_default/9,
-	 gen_relief/9,
-	 gen_relief/5,
-	 gen_bw/9,
-	 gen_bw/5,
+	 gen_relief/9, gen_relief/5,
+	 gen_bw/9, gen_bw/5,
 	 gen_font_wh/5,
 	 gen_choose_font/5,
-	 gen_data/9,
-	 gen_data/5,
-	 gen_pack_x/9,
-	 gen_pack_x/5,
-	 gen_pack_y/9,
-	 gen_pack_y/5,
+	 gen_data/9, gen_data/5,
+	 gen_pack_x/9, gen_pack_x/5,
+	 gen_pack_y/9, gen_pack_y/5,
 	 gen_pack_xy/9,
-	 gen_flush/9,
-	 gen_flush/5,
+	 gen_flush/9, gen_flush/5,
 	 gen_keep_opt/9,
 	 gen_children/5,
 	 make_extern_id/2,
@@ -94,78 +67,47 @@
 	 gen_parent/5,
 	 gen_type/5,
 	 gen_beep/9,
-	 gen_setfocus/9,
-	 gen_setfocus/5,
-	 gen_buttonpress/9,
-	 gen_buttonpress/5,
-	 gen_buttonrelease/9,
-	 gen_buttonrelease/5,
-	 gen_configure/9,
-	 gen_configure/5,
-	 gen_destroy/9,
-	 gen_destroy/5,
-	 gen_enter/9,
-	 gen_enter/5,
-	 gen_focus_ev/9,
-	 gen_focus_ev/5,
-	 gen_keypress/9,
-	 gen_keypress/5,
-	 gen_keyrelease/9,
-	 gen_keyrelease/5,
-	 gen_leave/9,
-	 gen_leave/5,
-	 gen_motion/9,
-	 gen_motion/5,
-	 gen_highlightbw/9,
-	 gen_highlightbw/5,
-	 gen_highlightbg/9,
-	 gen_highlightbg/5,
-	 gen_highlightfg/9,
-	 gen_highlightfg/5,
-	 gen_selectbw/9,
-	 gen_selectbw/5,
-	 gen_selectfg/9,
-	 gen_selectfg/5,
-	 gen_selectbg/9,
-	 gen_selectbg/5,
-	 gen_fg/9,
-	 gen_fg/5,
-	 gen_bg/9,
-	 gen_bg/5,
-	 gen_so_activebg/9,
-	 gen_so_activebg/5,
-	 gen_so_bc/9,
-	 gen_so_bc/5,
-	 gen_so_scrollfg/9,
-	 gen_so_scrollfg/5,
-	 gen_so_scrollbg/9,
-	 gen_so_scrollbg/5,
+	 gen_setfocus/9, gen_setfocus/5,
+	 gen_buttonpress/9, gen_buttonpress/5,
+	 gen_buttonrelease/9, gen_buttonrelease/5,
+	 gen_configure/9, gen_configure/5,
+	 gen_destroy/9, gen_destroy/5,
+	 gen_enter/9, gen_enter/5,
+	 gen_focus_ev/9, gen_focus_ev/5,
+	 gen_keypress/9, gen_keypress/5,
+	 gen_keyrelease/9, gen_keyrelease/5,
+	 gen_leave/9, gen_leave/5,
+	 gen_motion/9, gen_motion/5,
+	 gen_highlightbw/9, gen_highlightbw/5,
+	 gen_highlightbg/9, gen_highlightbg/5,
+	 gen_highlightfg/9, gen_highlightfg/5,
+	 gen_selectbw/9, gen_selectbw/5,
+	 gen_selectfg/9, gen_selectfg/5,
+	 gen_selectbg/9, gen_selectbg/5,
+	 gen_fg/9, gen_fg/5,
+	 gen_bg/9, gen_bg/5,
+	 gen_so_activebg/9, gen_so_activebg/5,
+	 gen_so_bc/9, gen_so_bc/5,
+	 gen_so_scrollfg/9, gen_so_scrollfg/5,
+	 gen_so_scrollbg/9, gen_so_scrollbg/5,
 	 obj/1,
-	 gen_so_bg/9,
-	 gen_so_bg/5,
-	 gen_so_selectbw/9,
-	 gen_so_selectbw/5,
-	 gen_so_selectfg/9,
-	 gen_so_selectfg/5,
-	 gen_so_selectbg/9,
-	 gen_so_selectbg/5,
+	 gen_so_bg/9, gen_so_bg/5,
+	 gen_so_selectbw/9, gen_so_selectbw/5,
+	 gen_so_selectfg/9, gen_so_selectfg/5,
+	 gen_so_selectbg/9, gen_so_selectbg/5,
 	 gen_so_scrolls/9,
 	 gen_so_hscroll/5,
 	 gen_so_vscroll/5,
 	 cursors/0,
-	 gen_cursor/9,
-	 gen_cursor/5,
-	 gen_citem_coords/9,
-	 gen_citem_coords/5,
-	 gen_citem_fill/9,
-	 gen_citem_fill/5,
+	 gen_cursor/9, gen_cursor/5,
+	 gen_citem_coords/9, gen_citem_coords/5,
+	 gen_citem_fill/9, gen_citem_fill/5,
 	 gen_citem_lower/9,
 	 gen_citem_raise/9,
 	 gen_citem_move/9,
 	 move_coords/3,
 	 add_to_coords/3,
-	 gen_citem_setfocus/9,
-	 gen_citem_setfocus/5,
+	 gen_citem_setfocus/9, gen_citem_setfocus/5,
 	 gen_citem_buttonpress/9,
 	 gen_citem_buttonrelease/9,
 	 gen_citem_enter/9,
@@ -174,11 +116,8 @@
 	 gen_citem_leave/9,
 	 gen_citem_motion/9,
 	 scrolls_vh/3,
-	 parse_scrolls/1,
-	 parse_scrolls/2,
-	 parse_scrolls/4,
-	 bind/5,
-	 bind/6,
+	 parse_scrolls/1, parse_scrolls/2, parse_scrolls/4,
+	 bind/5, bind/6,
 	 ebind/6,
 	 eunbind/6,
 	 item_bind/6,
@@ -195,12 +134,9 @@
 %%----------------------------------------------------------------------
 %% Returns: a new unique TkWidget (string())
 %%----------------------------------------------------------------------
-mk_tkw_child(DB,#gstkid{parent=P,objtype=Ot}) ->
-    Pgstkid = gstk_db:lookup_gstkid(DB, P),
-    PW = Pgstkid#gstkid.widget,
-    Oref = gstk_db:counter(DB, Ot),
-    PF = gstk_widgets:suffix(Ot),
-    _TkW = lists:concat([PW, PF, Oref]).
+mk_tkw_child(DB, #gstkid{parent = P, objtype = Ot}) ->
+    #gstkid{widget = PW} = gstk_db:lookup_gstkid(DB, P),
+    _TkW = lists:concat([PW, gstk_widgets:suffix(Ot), gstk_db:counter(DB, Ot)]).
 
 %%----------------------------------------------------------------------
 %% Purpose: Merges options. Opts have higher priority than BuiltIn
@@ -209,53 +145,39 @@ mk_tkw_child(DB,#gstkid{parent=P,objtype
 %%----------------------------------------------------------------------
 merge_default_options(ParOpts, BuildInOpts, Opts) ->
     %% parents options first
-    Tmp=merge_default_options(ParOpts, lists:sort(Opts)), 
-    merge_default_options(BuildInOpts,Tmp).
-
-merge_default_options([Def|Ds],[Opt|Os]) 
-  when element(1,Def) < element(1,Opt) ->
-    [Def | merge_default_options(Ds,[Opt|Os])];
+    merge_default_options(BuildInOpts, merge_default_options(ParOpts, lists:sort(Opts))).
 
-merge_default_options([Def|Ds],[Opt|Os]) 
-  when element(1,Def) > element(1,Opt) ->
-    [Opt | merge_default_options([Def|Ds],Os)];
+merge_default_options([Def|Ds], [Opt|Os]) when element(1, Def) < element(1, Opt) ->
+    [Def|merge_default_options(Ds, [Opt|Os])];
+merge_default_options([Def|Ds], [Opt|Os]) when element(1, Def) == element(1, Opt) ->
+    [Opt|merge_default_options(Ds, Os)];
+merge_default_options([Def|Ds], [Opt|Os]) when tuple_size(Def) >= 1, tuple_size(Opt) >= 1 ->
+    [Opt|merge_default_options([Def|Ds], Os)];
+merge_default_options(Defs, [Opt|Os]) -> [Opt|merge_default_options(Defs, Os)];
+merge_default_options([], Opts) -> Opts;
+merge_default_options(Defs, []) -> Defs.
 
-merge_default_options([Def|Ds],[Opt|Os]) 
-  when element(1,Def) == element(1,Opt) ->
-    [Opt | merge_default_options(Ds,Os)];
+opts_for_child(DB, Childtype, ParId) ->
+    case gs_widgets:container(Childtype) of
+	true -> gstk_db:default_container_opts(DB, ParId, Childtype);
+	false -> gstk_db:default_opts(DB, ParId, Childtype)
+    end.
 
-merge_default_options(Defs,[Opt|Os]) ->
-    [Opt | merge_default_options(Defs,Os)];
+mk_create_opts_for_child(DB, #gstkid{objtype = ChildType}, #gstkid{id = Id}, Opts) ->
+    merge_default_options(opts_for_child(DB, ChildType, Id), gs_widgets:default_options(ChildType), Opts).
 
-merge_default_options([],Opts) -> Opts;
-merge_default_options(Defs,[]) -> Defs.
+mk_cmd_and_exec(Opts, #gstkid{widget = TkW} = Gstkid, Scmd, DB) ->
+    mk_cmd_and_exec(Opts, Gstkid, TkW, Scmd, [";place ", TkW], DB).
 
-opts_for_child(DB,Childtype,ParId) ->
-    case gs_widgets:container(Childtype) of
-	true -> 
-	    gstk_db:default_container_opts(DB,ParId,Childtype);
-	false ->
-	    gstk_db:default_opts(DB,ParId,Childtype)
-    end.
+mk_cmd_and_exec(Opts, #gstkid{widget = TkW} = Gstkid, Scmd, Pcmd, DB) ->
+    mk_cmd_and_exec(Opts, Gstkid, TkW, Scmd, Pcmd, DB).
 
-mk_create_opts_for_child(DB,#gstkid{objtype=ChildType}, Pgstkid, Opts) ->
-    merge_default_options(
-      opts_for_child(DB,ChildType,Pgstkid#gstkid.id),
-      gs_widgets:default_options(ChildType),
-      Opts).
+mk_cmd_and_exec(Options, Gstkid, TkW, SCmd, PCmd, DB) -> mk_cmd_and_exec(Options, Gstkid, TkW, SCmd, PCmd, DB, dummy).
 
-mk_cmd_and_exec(Opts,Gstkid,Scmd,DB) ->
-    TkW = Gstkid#gstkid.widget,
-    mk_cmd_and_exec(Opts,Gstkid,TkW,Scmd,[";place ", TkW],DB,dummy).
-mk_cmd_and_exec(Opts,Gstkid,Scmd,Pcmd,DB) ->
-    mk_cmd_and_exec(Opts,Gstkid,Gstkid#gstkid.widget,Scmd,Pcmd,DB,dummy).
-mk_cmd_and_exec(Options, Gstkid, TkW, SCmd, PCmd, DB) ->
-    mk_cmd_and_exec(Options, Gstkid, TkW, SCmd, PCmd, DB,dummy).
-mk_cmd_and_exec(Options, Gstkid, TkW, SCmd, PCmd, DB,ExtraArg) ->
-    case gstk_generic:make_command(Options,Gstkid,TkW,SCmd,PCmd,DB,ExtraArg) of
-	{error,Reason} -> {error,Reason};
-	Cmd when is_list(Cmd) ->
-	    gstk:exec(Cmd)
+mk_cmd_and_exec(Options, Gstkid, TkW, SCmd, PCmd, DB, ExtraArg) ->
+    case gstk_generic:make_command(Options, Gstkid, TkW, SCmd, PCmd, DB, ExtraArg) of
+	{error, _Reason} = E -> E;
+	Cmd when is_list(Cmd) -> gstk:exec(Cmd)
     end.
 
 %%----------------------------------------------------------------------
@@ -265,628 +187,554 @@ mk_cmd_and_exec(Options, Gstkid, TkW, SC
 %% Comment: If some function changes the gstkid,
 %%          it's responsible for storing it in the DB.
 %%----------------------------------------------------------------------
-make_command(Opts,Gstkid,Scmd,DB) ->
-    TkW = Gstkid#gstkid.widget,
-    make_command(Opts,Gstkid,TkW,Scmd,[";place ", TkW],DB,dummy).
-make_command(Opts,Gstkid,Scmd,Pcmd,DB) ->
-    make_command(Opts,Gstkid,Gstkid#gstkid.widget,Scmd,Pcmd,DB,dummy).
-make_command(Options, Gstkid, TkW, SCmd, PCmd, DB) ->
-    make_command(Options, Gstkid, TkW, SCmd, PCmd, DB,dummy).
-make_command(Options, Gstkid, TkW, SCmd, PCmd, DB,ExtraArg) ->
+make_command(Opts, #gstkid{widget = TkW} = Gstkid, Scmd, DB) ->
+    make_command(Opts, Gstkid, TkW, Scmd, [";place ", TkW], DB).
+
+make_command(Options, #gstkid{widget = TkW} = Gstkid, Scmd, Pcmd, DB) ->
+    make_command(Options, Gstkid, TkW, Scmd, Pcmd, DB).
+
+make_command(Options, Gstkid, TkW, SCmd, PCmd, DB) -> make_command(Options, Gstkid, TkW, SCmd, PCmd, DB, dummy).
+
+make_command(Options, Gstkid, TkW, SCmd, PCmd, DB, ExtraArg) ->
     case out_opts(Options, Gstkid, TkW, DB, ExtraArg, [], [], []) of
 	{[], [], []} -> [];
-	{Si, [], []} -> [SCmd, Si,$;];
-	{[], Pl, []} -> [PCmd, Pl,$;];
-	{[], [], Co} -> [$;,Co];
+	{Si, [], []} -> [SCmd, Si, $;];
+	{[], Pl, []} -> [PCmd, Pl, $;];
+	{[], [], Co} -> [$;, Co];
 	{[], Pl, Co} -> [PCmd, Pl, $;, Co];
 	{Si, [], Co} -> [SCmd, Si, $;, Co];
 	{Si, Pl, []} -> [SCmd, Si, PCmd, Pl, $;];
 	{Si, Pl, Co} -> [SCmd, Si, PCmd, Pl, $;, Co];
-	{error,Reason} -> {error,Reason}
+	{error, _Reason} = E -> E
     end.
 
-read_option(DB,Gstkid,Opt) ->
-    read_option(DB,Gstkid,Gstkid#gstkid.widget,Opt,dummy).
-read_option(DB,Gstkid,Opt,ExtraArg) ->
-    read_option(DB,Gstkid,Gstkid#gstkid.widget,Opt,ExtraArg).
+read_option(DB, Gstkid, Opt) -> read_option(DB, Gstkid, Opt, dummy).
+
+read_option(DB, #gstkid{widget = Widget} = Gstkid, Opt, ExtraArg) -> read_option(DB, Gstkid, Widget, Opt, ExtraArg).
 
 %%----------------------------------------------------------------------
 %% Args: Args is [Gstkid, TkW, DB, ExtraArg]
 %% Comment: An optimization:don't reconstruct the arg list for apply each time.
 %%          This is the option-engine so we should optimize.
 %%----------------------------------------------------------------------
-handle_external_opt_call([Opt|Options],Gstkid,TkW,DB,ExtraArg,ExtRes,S,P,C) ->
-    case ExtRes of
-	{s, Cmd} ->
-	    out_opts(Options,Gstkid, TkW,DB, ExtraArg, [Cmd|S], P, C);
-	{p, Cmd} ->
-	    out_opts(Options, Gstkid,TkW,DB, ExtraArg, S, [Cmd|P], C);
-	{c, Cmd} ->
-	    out_opts(Options, Gstkid,TkW,DB, ExtraArg,S, P, [Cmd,$;|C]);
-	none ->
-	    out_opts(Options, Gstkid,TkW,DB,ExtraArg, S, P, C);
-						%	{s, NGstkid, Cmd} ->
-						%	    out_opts(Options,NGstkid,TkW,DB,ExtraArg, [Cmd|S], P, C);
-						%	{p, NGstkid, Cmd} ->
-						%	    out_opts(Options,NGstkid,TkW,DB,ExtraArg, S, [Cmd|P], C);
-	{c, NGstkid, Cmd} ->
-	    out_opts(Options,NGstkid,TkW,DB, ExtraArg,S,P,[Cmd,$;|C]);
-	{none, NGstkid} ->
-	    out_opts(Options,NGstkid,TkW,DB, ExtraArg, S, P, C);
-	{sp,{Scmd,Pcmd}} ->
-	    out_opts(Options,Gstkid,TkW,DB,ExtraArg,[Scmd|S],[Pcmd|P],C);
-	invalid_option ->
-	    {error,{invalid_option,Gstkid#gstkid.objtype,Opt}};
-	break -> % a hack. it is possible to abort generic option handling at
-	    %% any time (without even inserting the gstkid inte to DB (for
-	    %% performance reasons)).
-	    {S, P, C}
-    end.
+handle_external_opt_call([_Opt|Options], Gstkid, TkW, DB, ExtraArg, {s, Cmd}, S, P, C) ->
+    out_opts(Options, Gstkid, TkW, DB, ExtraArg, [Cmd|S], P, C);
+handle_external_opt_call([_Opt|Options], Gstkid, TkW, DB, ExtraArg, {p, Cmd}, S, P, C) ->
+    out_opts(Options, Gstkid, TkW, DB, ExtraArg, S, [Cmd|P], C);
+handle_external_opt_call([_Opt|Options], Gstkid, TkW, DB, ExtraArg, {c, Cmd}, S, P, C) ->
+    out_opts(Options, Gstkid, TkW, DB, ExtraArg, S, P, [Cmd, $;|C]);
+handle_external_opt_call([_Opt|Options], Gstkid, TkW, DB, ExtraArg, none, S, P, C) ->
+    out_opts(Options, Gstkid, TkW, DB, ExtraArg, S, P, C);
+handle_external_opt_call([_Opt|Options], _Gstkid, TkW, DB, ExtraArg, {c, NGstkid, Cmd}, S, P, C) ->
+    out_opts(Options, NGstkid, TkW, DB, ExtraArg, S, P, [Cmd, $;|C]);
+handle_external_opt_call([_Opt|Options], _Gstkid, TkW, DB, ExtraArg, {none, NGstkid}, S, P, C) ->
+    out_opts(Options, NGstkid, TkW, DB, ExtraArg, S, P, C);
+handle_external_opt_call([_Opt|Options], Gstkid, TkW, DB, ExtraArg, {sp, {Scmd, Pcmd}}, S, P, C) ->
+    out_opts(Options, Gstkid, TkW, DB, ExtraArg, [Scmd|S], [Pcmd|P], C);
+handle_external_opt_call([Opt|_Options], #gstkid{objtype = ObjType}, _TkW, _DB, _ExtraArg, invalid_option, _S, _P, _C) ->
+    {error, {invalid_option, ObjType, Opt}};
+%% a hack. it is possible to abort generic option handling at any time
+%% (without even inserting the gstkid inte to DB (for performance reasons)).
+handle_external_opt_call(_Options, _Gstkid, _TkW, _DB, _ExtraArg, break, S, P, C) -> {S, P, C}.
 
-handle_external_read(Res) ->
-    %% We have removed dead code here that attempted to translate
-    %% a bad return value from {bad_result,{A,B,C}} to {error,{A,B,C}}.
-    %% Since the gs application is deprecated, we don't want to introduce
-    %% a potential incompatibility; thus we have removed the dead code
-    %% instead of correcting it.
-    Res.
+%% We have removed dead code here that attempted to translate a bad return value from {bad_result, {A, B, C}}
+%% to {error, {A, B, C}}. Since the gs application is deprecated, we don't want to introduce a potential
+%% incompatibility; thus we have removed the dead code instead of correcting it.
+handle_external_read(Res) -> Res.
 
 %%----------------------------------------------------------------------
 %% Generic options
 %%----------------------------------------------------------------------
 
-gen_anchor(How,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,[" -anc ", gstk:to_ascii(How)|P],C).
-gen_anchor(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_place(anchor, TkW).
+gen_anchor(How, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, [" -anc ", gstk:to_ascii(How)|P], C).
 
-gen_height(Height,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    gstk_db:insert_opt(DB,Gstkid,{height,Height}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,
-	     [" -he ", gstk:to_ascii(Height)|P],C).
-gen_height(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:opt(DB,Gstkid,height).
+gen_anchor(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_place(anchor, TkW).
 
-gen_width(Width,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    gstk_db:insert_opt(DB,Gstkid,{width,Width}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,
-	     [" -wi ", gstk:to_ascii(Width)|P],C).
-gen_width(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:opt(DB,Gstkid,width).
+gen_height(Height, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_xy(Height, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, height, " -he ").
 
-gen_x(X,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    gstk_db:insert_opt(DB,Gstkid,{x,X}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,
-	     [" -x ", gstk:to_ascii(X)|P],C).
-gen_x(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:opt(DB,Gstkid,x).
+gen_height(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, height).
 
-gen_y(Y,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    gstk_db:insert_opt(DB,Gstkid,{y,Y}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,
-	     [" -y ", gstk:to_ascii(Y)|P],C).
-gen_y(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:opt(DB,Gstkid,y).
+gen_width(Width, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_xy(Width, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, width, " -wi ").
 
-gen_raise(_,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,["raise ", TkW,$;|C]).
-gen_raise(_Opt,_Gstkid,_TkW,_DB,_ExtraArg) ->
-    undefined.
+gen_width(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, width).
 
-gen_lower(_,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,["lower ", TkW,$;|C]).
-gen_lower(_Opt,_Gstkid,_TkW,_DB,_ExtraArg) ->
-    undefined.
+gen_xy(Z, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, T, Str) ->
+    gstk_db:insert_opt(DB, Gstkid, {T, Z}),
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, [Str, gstk:to_ascii(Z)|P], C).
 
-gen_enable(true,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -st normal"|S],P,C);
-gen_enable(false,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -st disabled"|S],P,C).
-gen_enable(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_enable([TkW, " cg -st"]).
+gen_x(X, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) -> gen_xy(X, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, x, " -x ").
 
-gen_align(How,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -an ", gstk:to_ascii(How)|S],P,C).
-gen_align(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_atom([TkW, " cg -anch"]).
+gen_x(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, x).
 
-gen_justify(How,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -ju ", gstk:to_ascii(How)|S],P,C).
-gen_justify(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_atom([TkW, " cg -ju"]).
+gen_y(Y, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) -> gen_xy(Y, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, y, " -y ").
 
-gen_padx(Pad,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -padx ", gstk:to_ascii(Pad)|S],P,C).
-gen_padx(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_atom([TkW, " cg -padx"]).
+gen_y(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, y).
 
-gen_pady(Pad,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -pady ", gstk:to_ascii(Pad)|S],P,C).
-gen_pady(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_atom([TkW, " cg -pady"]).
+gen_2(Str, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [Str, TkW, $;|C]).
 
+gen_raise(_, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_2("raise ", Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
 
-gen_font(Font,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    gstk_db:insert_opt(DB,Gstkid,{font,Font}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,
-	     [" -font ", gstk_font:choose_ascii(DB,Font)|S],P,C).
-gen_font(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:opt(DB,Gstkid,font,undefined).
+gen_raise(_Opt, _Gstkid, _TkW, _DB, _ExtraArg) -> undefined.
 
-gen_label({text,Text},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -text ", gstk:to_ascii(Text), " -bi {}"|S],P,C);
-gen_label({image,Img},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    I2 = re:replace(Img, [92,92], "/", [global,{return,list}]),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -bi \"@", I2, "\" -text {}"|S],P,C).
-gen_label(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
+gen_lower(_, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_2("lower ", Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
+
+gen_lower(_Opt, _Gstkid, _TkW, _DB, _ExtraArg) -> undefined.
+
+gen_enable(Opt, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) when is_boolean(Opt) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [if
+						   Opt -> " -st normal";
+						   true -> " -st disabled"
+					       end|S], P, C).
+
+gen_enable(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_enable([TkW, " cg -st"]).
+
+gen_align(How, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_pad(How, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -an ").
+
+gen_align(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> gen_pad(" cg -anch", TkW).
+
+gen_justify(How, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_pad(How, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -ju ").
+
+gen_justify(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> gen_pad(" cg -ju", TkW).
+
+gen_pad(Pad, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [Str, gstk:to_ascii(Pad)|S], P, C).
+
+gen_pad(Str, TkW) -> tcl2erl:ret_atom([TkW, Str]).
+
+gen_padx(Pad, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_pad(Pad, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -padx ").
+
+gen_padx(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> gen_pad(" cg -padx", TkW).
+
+gen_pady(Pad, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_pad(Pad, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -pady ").
+
+gen_pady(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> gen_pad(" cg -pady", TkW).
+
+gen_font(Font, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gstk_db:insert_opt(DB, Gstkid, {font, Font}),
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -font ", gstk_font:choose_ascii(DB, Font)|S], P, C).
+
+gen_font(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, font, undefined).
+
+gen_label({text, Text}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -text ", gstk:to_ascii(Text), " -bi {}"|S], P, C);
+gen_label({image, Img}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg,
+	     [" -bi \"@", re:replace(Img, [92, 92], "/", [global, {return, list}]), "\" -text {}"|S], P, C).
+
+gen_label(_Opt, _Gstkid, TkW, _DB, _ExtraArg) ->
     case gstk:call([TkW, " cg -bit"]) of
-	{result, [$@|Image]} -> {image,Image};
-	_Nope ->
-	    case gstk:call([TkW, " cg -text"]) of
-		{result, Txt} -> {text, Txt};
-		Bad_Result -> Bad_Result
-	    end
+	{result, [$@|Image]} -> {image, Image};
+	_Nope -> case gstk:call([TkW, " cg -text"]) of
+		     {result, Txt} -> {text, Txt};
+		     Bad_Result -> Bad_Result
+		 end
     end.
 
-gen_activebg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -activeba ", gstk:to_color(Color)|S],P,C).
-gen_activebg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([TkW, " cg -activeba"]).
+gen_active(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [Str, gstk:to_color(Color)|S], P, C).
 
-gen_activefg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -activef ", gstk:to_color(Color)|S],P,C).
-gen_activefg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([TkW, " cg -activef"]).
+gen_activebg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_active(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -activeba ").
 
+gen_activebg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -activeba"]).
 
-gen_default(Opt,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    case Opt of
-	{all, {font, Font}} ->
-	    C2 = ["option a *",tl(TkW), % have to remove preceeding dot
-		  "*font ",gstk_font:choose_ascii(DB, Font)],
-	    gstk_db:insert_def(Gstkid,grid,{font,Font}),
-	    gstk_db:insert_def(Gstkid,text,{font,Font}),
-	    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]);
-	{buttons, {font, Font}} ->
-	    C2 = ["option a *",tl(TkW), % have to remove preceeding dot
-		  ".Button.font ",gstk_font:choose_ascii(DB, Font)],
-	    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]);
-	{buttons,{Key,Val}} ->
-	    gstk_db:insert_def(Gstkid,button,{Key,Val}),
-	    gstk_db:insert_def(Gstkid,checkbutton,{Key,Val}),
-	    gstk_db:insert_def(Gstkid,radiobutton,{Key,Val}),
-	    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C);
-	{ObjType, {Key,Val}} ->
-	    gstk_db:insert_def(Gstkid,ObjType,{Key,Val}),
-	    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C)
-    end.
+gen_activefg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_active(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -activef ").
 
+gen_activefg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -activef"]).
 
-gen_relief(Relief,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -reli ",gstk:to_ascii(Relief)|S],P,C).
-gen_relief(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_atom([TkW, " cg -reli"]).
+gen_default_font(Font, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P,
+	     [["option a *", tl(TkW), % have to remove preceeding dot
+	       Str, gstk_font:choose_ascii(DB, Font)], $;|C]).
 
-gen_bw(Wth,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -bd ", gstk:to_ascii(Wth)|S],P,C).
-gen_bw(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_int([TkW, " cg -bd"]).
+gen_default({all, {font, Font}}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    lists:foreach(fun(E) -> gstk_db:insert_def(Gstkid, E, {font, Font}) end, [grid, text]),
+    gen_default_font(Font, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, "*font ");
+gen_default({buttons, {font, Font}}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_default_font(Font, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, ".Button.font ");
+gen_default({buttons, {_Key, _Val} = KV}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    lists:foreach(fun(E) -> gstk_db:insert_def(Gstkid, E, KV) end, [button, checkbutton, radiobutton]),
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C);
+gen_default({ObjType, {_Key, _Val} = KV}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gstk_db:insert_def(Gstkid, ObjType, KV),
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
 
+gen_1(Val, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [Str, gstk:to_ascii(Val)|S], P, C).
 
+gen_relief(Relief, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_1(Relief, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -reli ").
 
-gen_font_wh({font_wh,{Font, Txt}},_Gstkid,_TkW,DB,_) ->
-    gstk_font:width_height(DB, gstk_font:choose(DB,Font), Txt).
+gen_relief(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_atom([TkW, " cg -reli"]).
 
-gen_choose_font({choose_font,Font},_Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_font:choose(DB,Font).
+gen_bw(Wth, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_1(Wth, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -bd ").
 
-gen_data(Data,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    gstk_db:insert_opt(DB,Gstkid,{data,Data}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C).
-gen_data(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:opt(DB,Gstkid,data).
+gen_bw(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_int([TkW, " cg -bd"]).
 
-gen_pack_x({Start,Stop},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    gstk_db:insert_opt(DB,Gstkid,{pack_x,{Start,Stop}}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C);
-gen_pack_x(Col,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) when is_integer(Col) ->
-    gstk_db:insert_opt(DB,Gstkid,{pack_x,{Col,Col}}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C).
-gen_pack_x(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:opt(DB,Gstkid,pack_x, undefined).
+gen_font_wh({font_wh, {Font, Txt}}, _Gstkid, _TkW, DB, _) -> gstk_font:width_height(DB, gstk_font:choose(DB, Font), Txt).
 
-gen_pack_y({Start,Stop},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    gstk_db:insert_opt(DB,Gstkid,{pack_y,{Start,Stop}}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C);
-gen_pack_y(Row,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) when is_integer(Row) ->
-    gstk_db:insert_opt(DB,Gstkid,{pack_y,{Row,Row}}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C).
-gen_pack_y(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:opt(DB,Gstkid,pack_y, undefined).
+gen_choose_font({choose_font, Font}, _Gstkid, _TkW, DB, _ExtraArg) -> gstk_font:choose(DB, Font).
 
-gen_pack_xy({Col,Row},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C)
-  when is_integer(Col), is_integer(Row) ->
-    gstk_db:insert_opt(DB,Gstkid,{pack_x,{Col,Col}}),
-    gstk_db:insert_opt(DB,Gstkid,{pack_y,{Row,Row}}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C);
-gen_pack_xy({Col,{StartRow,StopRow}},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C)
-  when is_integer(Col) ->
-    gstk_db:insert_opt(DB,Gstkid,{pack_x,{Col,Col}}),
-    gstk_db:insert_opt(DB,Gstkid,{pack_y,{StartRow,StopRow}}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C);
-gen_pack_xy({{StartCol,StopCol},Row},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C)
-  when is_integer(Row) ->
-    gstk_db:insert_opt(DB,Gstkid,{pack_x,{StartCol,StopCol}}),
-    gstk_db:insert_opt(DB,Gstkid,{pack_y,{Row,Row}}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C);
-gen_pack_xy({Col,Row},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    gstk_db:insert_opt(DB,Gstkid,{pack_x,Col}),
-    gstk_db:insert_opt(DB,Gstkid,{pack_y,Row}),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C).
+gen_data(Data, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gstk_db:insert_opt(DB, Gstkid, {data, Data}),
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
 
+gen_data(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, data).
 
-gen_flush(_Opt,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C)  -> 
-    tcl2erl:ret_int(["update idletasks;expr 1+1"]),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C).
-gen_flush(_Opt,_Gstkid,_TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_int(["update idletasks;expr 1+1"]).
+gen_pack_x({_Start, _Stop} = SS, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gstk_db:insert_opt(DB, Gstkid, {pack_x, SS}),
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C);
+gen_pack_x(Col, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) when is_integer(Col) ->
+    gen_pack_x({Col, Col}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
+
+gen_pack_x(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, pack_x, undefined).
+
+gen_pack_y({_Start, _Stop} = SS, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gstk_db:insert_opt(DB, Gstkid, {pack_y, SS}),
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C);
+gen_pack_y(Row, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) when is_integer(Row) ->
+    gen_pack_y({Row, Row}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
+
+gen_pack_y(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, pack_y, undefined).
+
+gen_pack_xy({Col, Row}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) when is_integer(Col), is_integer(Row) ->
+    gen_pack_xy({Col, Col}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, {Row, Row});
+gen_pack_xy({Col, {_StartRow, _StopRow} = SS}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) when is_integer(Col) ->
+    gen_pack_xy({Col, Col}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, SS);
+gen_pack_xy({{_StartCol, _StopCol} = SS, Row}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) when is_integer(Row) ->
+    gen_pack_xy(SS, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, {Row, Row});
+gen_pack_xy({Col, Row}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_pack_xy(Col, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Row).
+
+gen_pack_xy(Col, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Row) ->
+    gstk_db:insert_opt(DB, Gstkid, {pack_x, Col}),
+    gstk_db:insert_opt(DB, Gstkid, {pack_y, Row}),
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
+
+gen_flush(_Opt, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_flush(),
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
+
+gen_flush(_Opt, _Gstkid, _TkW, _DB, _ExtraArg) -> gen_flush().
+
+gen_flush() -> tcl2erl:ret_int(["update idletasks;expr 1+1"]).
 
 						% a hidden impl option.
-gen_keep_opt(Opt,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C)  -> 
-    gstk_db:insert_opt(DB,Gstkid,Opt),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C).
+gen_keep_opt(Opt, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C)  -> 
+    gstk_db:insert_opt(DB, Gstkid, Opt),
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
 
-gen_children(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    make_extern_id(gstk_db:lookup_kids(DB, Gstkid#gstkid.id), DB).
+gen_children(_Opt, #gstkid{id = Id}, _TkW, DB, _ExtraArg) -> make_extern_id(gstk_db:lookup_kids(DB, Id), DB).
 
-make_extern_id([Id|Ids], DB) ->
-    [gstk:make_extern_id(Id, DB) | make_extern_id(Ids, DB)];
-make_extern_id([], _) -> [].
+make_extern_id(Ids, DB) when is_list(Ids) -> lists:foldr(fun(Id, A) -> [gstk:make_extern_id(Id, DB)|A] end, [], Ids).
 
-gen_id(_Opt,#gstkid{id=Id},_TkW,DB,_ExtraArg) ->
-    gstk:make_extern_id(Id, DB).
+gen_id(_Opt, #gstkid{id = Id}, _TkW, DB, _ExtraArg) -> gstk:make_extern_id(Id, DB).
 
-gen_parent(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk:make_extern_id(Gstkid#gstkid.parent, DB).
+gen_parent(_Opt, #gstkid{parent = Parent}, _TkW, DB, _ExtraArg) -> gstk:make_extern_id(Parent, DB).
 
-gen_type(_Opt,Gstkid,_TkW,_DB,_ExtraArg) ->
-    Gstkid#gstkid.objtype.
+gen_type(_Opt, #gstkid{objtype = ObjType}, _TkW, _DB, _ExtraArg) -> ObjType.
 
-gen_beep(_,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,["bell;",$;|C]).
+gen_beep(_, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, ["bell;", $;|C]).
 
-gen_setfocus(true,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,["focus ", TkW,$;|C]);
-gen_setfocus(false,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,["focus .",$;|C]).
+gen_setfocus(true, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, ["focus ", TkW, $;|C]);
+gen_setfocus(false, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, ["focus .", $;|C]).
 
-gen_setfocus(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_focus(TkW, "focus").
+gen_setfocus(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_focus(TkW, "focus").
 
-gen_buttonpress(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    Cmd = bind(DB, Gstkid, TkW, buttonpress, On),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_buttonpress(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:is_inserted(DB, Gstkid, buttonpress).
+gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, T) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [bind(DB, Gstkid, TkW, T, On), $;|C]).
 
-gen_buttonrelease(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    Cmd = bind(DB, Gstkid, TkW, buttonrelease, On),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_buttonrelease(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:is_inserted(DB,Gstkid,buttonrelease).
+is_inserted(DB, Gstkid, T) -> gstk_db:is_inserted(DB, Gstkid, T).
 
-gen_configure(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    Cmd = bind(DB, Gstkid, TkW, configure, On),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_configure(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:is_inserted(DB,Gstkid,configure).
+gen_buttonpress(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, buttonpress).
 
-gen_destroy(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    Cmd = bind(DB, Gstkid, TkW, destroy, On),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_destroy(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:is_inserted(DB,Gstkid,destroy).
+gen_buttonpress(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, buttonpress).
 
-gen_enter(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    Cmd = bind(DB, Gstkid, TkW, enter, On),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_enter(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:is_inserted(DB,Gstkid,enter).
+gen_buttonrelease(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, buttonrelease).
 
-gen_focus_ev(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    Cmd = bind(DB, Gstkid, TkW, focus, On),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_focus_ev(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:is_inserted(DB,Gstkid,focus).
+gen_buttonrelease(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, buttonrelease).
 
-gen_keypress(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    Cmd = bind(DB, Gstkid, TkW, keypress, On),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_keypress(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:is_inserted(DB,Gstkid,keypress).
+gen_configure(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, configure).
 
-gen_keyrelease(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    Cmd = bind(DB, Gstkid, TkW, keyrelease, On),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_keyrelease(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:is_inserted(DB,Gstkid,keyrelease).
+gen_configure(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, configure).
 
-gen_leave(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    Cmd = bind(DB, Gstkid, TkW, leave, On),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_leave(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:is_inserted(DB,Gstkid,leave).
+gen_destroy(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, destroy).
 
-gen_motion(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    Cmd = bind(DB, Gstkid, TkW, motion, On),
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_motion(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:is_inserted(DB,Gstkid,motion).
+gen_destroy(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, destroy).
 
-gen_highlightbw(Wth,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -highlightt ", gstk:to_ascii(Wth)|S],P,C).
-gen_highlightbw(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_int([TkW, " cg -highlightt"]).
+gen_enter(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, enter).
 
-gen_highlightbg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -highlightb ", gstk:to_color(Color)|S],P,C).
-gen_highlightbg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([TkW, " cg -highlightb"]).
+gen_enter(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, enter).
 
-gen_highlightfg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -highlightc ", gstk:to_color(Color)|S],P,C).
-gen_highlightfg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([TkW,  " cg -highlightc"]).
+gen_focus_ev(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, focus).
 
+gen_focus_ev(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, focus).
 
-gen_selectbw(Width,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[TkW, " conf -selectbo ", gstk:to_ascii(Width),$;|C]).
-gen_selectbw(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_int([TkW," cg -selectbo"]).
+gen_keypress(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, keypress).
 
-gen_selectfg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[TkW, " conf -selectfo ", gstk:to_color(Color),$;|C]).
-gen_selectfg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([TkW," cg -selectfo"]).
+gen_keypress(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, keypress).
 
-gen_selectbg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[TkW, " conf -selectba ", gstk:to_color(Color),$;|C]).
-gen_selectbg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([TkW," cg -selectba"]).
+gen_keyrelease(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, keyrelease).
 
-gen_fg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -fg ", gstk:to_color(Color)|S],P,C).
-gen_fg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([TkW, " cg -fg"]).
+gen_keyrelease(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, keyrelease).
 
-gen_bg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -bg ", gstk:to_color(Color)|S],P,C).
-gen_bg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([TkW, " cg -bg"]).
+gen_leave(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, leave).
+
+gen_leave(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, leave).
+
+gen_motion(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, motion).
+
+gen_motion(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, motion).
+
+gen_highlightbw(Wth, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -highlightt ", gstk:to_ascii(Wth)|S], P, C).
+
+gen_highlightbw(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_int([TkW, " cg -highlightt"]).
+
+gen_highlight(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [Str, gstk:to_color(Color)|S], P, C).
+
+gen_highlightbg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_highlight(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -highlightb ").
+
+gen_highlightbg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -highlightb"]).
+
+gen_highlightfg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_highlight(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -highlightc ").
+
+gen_highlightfg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW,  " cg -highlightc"]).
+
+gen_selectbw(Width, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [TkW, " conf -selectbo ", gstk:to_ascii(Width), $;|C]).
+
+gen_selectbw(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_int([TkW, " cg -selectbo"]).
+
+gen_selectfg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [TkW, " conf -selectfo ", gstk:to_color(Color), $;|C]).
+
+gen_selectfg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -selectfo"]).
+
+gen_selectbg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [TkW, " conf -selectba ", gstk:to_color(Color), $;|C]).
+
+gen_selectbg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -selectba"]).
+
+gen_fg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -fg ", gstk:to_color(Color)|S], P, C).
+gen_fg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -fg"]).
+
+gen_bg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -bg ", gstk:to_color(Color)|S], P, C).
+
+gen_bg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -bg"]).
 
 %%----------------------------------------------------------------------
 %% Generic functions for scrolled objects
 %%----------------------------------------------------------------------
-gen_so_activebg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
+gen_so_activebg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
     Col = gstk:to_color(Color),
-    C2 = [TkW, ".sy conf -activeba ", Col,$;,
-	  TkW, ".pad.sx conf -activeba ", Col],
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_activebg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([TkW,".sy cg -activeba"]).
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P,
+	     [[TkW, ".sy conf -activeba ", Col, $;, TkW, ".pad.sx conf -activeba ", Col], $;|C]).
 
-gen_so_bc(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    Col = gstk:to_color(Color),
-    C2= [TkW, " conf -bg ", Col,$;,
-	 TkW, ".sy conf -highlightba ", Col,$;,
-	 TkW, ".pad.it conf -bg ", Col,$;,
-	 TkW, ".pad.sx conf -highlightba ", Col],
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_bc(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([TkW," cg -bg"]).
+gen_so_activebg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, ".sy cg -activeba"]).
 
-gen_so_scrollfg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
+gen_so_bc(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
     Col = gstk:to_color(Color),
-    C2=[TkW, ".sy conf -bg ", Col,$;,
-	TkW, ".pad.sx conf -bg ", Col],
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_scrollfg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([TkW,".sy cg -bg"]).
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P,
+	     [[TkW, " conf -bg ", Col, $;, TkW, ".sy conf -highlightba ", Col, $;,
+	       TkW, ".pad.it conf -bg ", Col, $;, TkW, ".pad.sx conf -highlightba ", Col], $;|C]).
 
+gen_so_bc(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -bg"]).
 
-gen_so_scrollbg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
+gen_so_scroll(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
     Col = gstk:to_color(Color),
-    C2 = [TkW, ".sy conf -troughc ", Col, $;,
-	  TkW, ".pad.sx conf -troughc ", Col],
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P,
+	     [[TkW, ".sy conf -" ++ Str, Col, $;, TkW, ".pad.sx conf -" ++ Str, Col], $;|C]).
 
-gen_so_scrollbg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([TkW,".sy cg -troughc"]).
+gen_so_scrollfg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_so_scroll(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, "bg ").
 
-obj(#gstkid{widget_data=SO}) ->
-    SO#so.object.
+gen_so_scrollfg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, ".sy cg -bg"]).
 
-gen_so_bg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    C2= [obj(Gstkid), " conf -bg ", gstk:to_color(Color)],
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_bg(_Opt,Gstkid,_TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([obj(Gstkid)," cg -bg"]).
+gen_so_scrollbg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    gen_so_scroll(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, "troughc ").
 
-gen_so_selectbw(Width,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    C2 = [obj(Gstkid), " conf -selectbo ", gstk:to_ascii(Width)],
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_selectbw(_Opt,Gstkid,_TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_int([obj(Gstkid)," cg -selectbo"]).
+gen_so_scrollbg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, ".sy cg -troughc"]).
 
-gen_so_selectfg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    C2 = [obj(Gstkid), " conf -selectfo ", gstk:to_color(Color)],
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_selectfg(_Opt,Gstkid,_TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([obj(Gstkid)," cg -selectfo"]).
+obj(#gstkid{widget_data = #so{object = O}}) -> O.
 
-gen_so_selectbg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    C2 = [obj(Gstkid), " conf -selectba ", gstk:to_color(Color)],
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_selectbg(_Opt,Gstkid,_TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_color([obj(Gstkid)," cg -selectba"]).
+to_color(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [[obj(Gstkid), Str, gstk:to_color(Color)], $;|C]).
 
-gen_so_scrolls({Vscroll, Hscroll},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    SO = Gstkid#gstkid.widget_data,
-    NewSO = SO#so{hscroll=Hscroll, vscroll=Vscroll},
-    C2 = scrolls_vh(TkW, Vscroll, Hscroll),
-    Ngstkid = Gstkid#gstkid{widget_data=NewSO},
-    gstk_db:update_widget(DB,Ngstkid),
-    out_opts(Opts,Ngstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
+gen_so_bg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    to_color(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " conf -bg ").
+
+gen_so_bg(_Opt, Gstkid, _TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([obj(Gstkid), " cg -bg"]).
+
+gen_so_selectbw(Width, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [[obj(Gstkid), " conf -selectbo ", gstk:to_ascii(Width)], $;|C]).
+
+gen_so_selectbw(_Opt, Gstkid, _TkW, _DB, _ExtraArg) -> tcl2erl:ret_int([obj(Gstkid), " cg -selectbo"]).
+
+gen_so_selectfg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    to_color(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " conf -selectfo ").
+
+gen_so_selectfg(_Opt, Gstkid, _TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([obj(Gstkid), " cg -selectfo"]).
+
+gen_so_selectbg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    to_color(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " conf -selectba ").
+
+gen_so_selectbg(_Opt, Gstkid, _TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([obj(Gstkid), " cg -selectba"]).
+
+gen_so_scrolls({Vscroll, Hscroll}, Opts, #gstkid{widget_data = SO} = Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    Ngstkid = Gstkid#gstkid{widget_data = SO#so{hscroll = Hscroll, vscroll = Vscroll}},
+    gstk_db:update_widget(DB, Ngstkid),
+    out_opts(Opts, Ngstkid, TkW, DB, ExtraArg, S, P, [scrolls_vh(TkW, Vscroll, Hscroll), $;|C]).
 
 						% read-only
-gen_so_hscroll(_Opt,#gstkid{widget_data=SO},_TkW,_DB,_) ->
-    SO#so.hscroll.
+gen_so_hscroll(_Opt, #gstkid{widget_data = #so{vscroll = Hscroll}}, _TkW, _DB, _) -> Hscroll.
 
 						% read-only
-gen_so_vscroll(_Opt,#gstkid{widget_data=SO},_TkW,_DB,_) ->
-    SO#so.vscroll.
+gen_so_vscroll(_Opt, #gstkid{widget_data = #so{vscroll = Vscroll}}, _TkW, _DB, _) -> Vscroll.
 
-cursors() -> [{arrow,"top_left_arrow"},{busy,"watch"},{cross,"X_cursor"},
-	      {hand,"hand2"},{help,"question_arrow"},{resize,"fleur"},
-	      {text,"xterm"}].
+-define(CURSORS, [{arrow, "top_left_arrow"}, {busy, "watch"}, {cross, "X_cursor"}, {hand, "hand2"},
+		  {help, "question_arrow"}, {resize, "fleur"}, {text, "xterm"}]).
 
-gen_cursor(parent,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -cur {}"|S],P,C);
-gen_cursor(Cur,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
-    case gs:assq(Cur,cursors()) of
+cursors() -> ?CURSORS.
+
+gen_cursor(parent, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -cur {}"|S], P, C);
+gen_cursor(Cur, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+    case gs:assq(Cur, ?CURSORS) of
 	{value, TxtCur} ->
-	    out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -cur ",TxtCur|S],P,C);
-	_ ->
-	    {error,{invalid_cursor,Gstkid#gstkid.objtype,Cur}}
+	    out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -cur ", TxtCur|S], P, C);
+	_ -> {error, {invalid_cursor, Gstkid#gstkid.objtype, Cur}}
     end.
-gen_cursor(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    case tcl2erl:ret_str([TkW," cg -cur"]) of
+
+gen_cursor(_Opt, _Gstkid, TkW, _DB, _ExtraArg) ->
+    case tcl2erl:ret_str([TkW, " cg -cur"]) of
 	"" -> parent;
-	Txt when is_list(Txt) ->
-	    case lists:keysearch(Txt,2,cursors()) of
-		{value,{Cur,_}} -> Cur;
-		_ -> {bad_result, read_cursor}
-	    end;
+	Txt when is_list(Txt) -> case lists:keyfind(Txt, 2, ?CURSORS) of
+				     {Cur, _} -> Cur;
+				     _ -> {bad_result, read_cursor}
+				 end;
 	Bad_Result -> Bad_Result
     end.
 
-gen_citem_coords(Coords,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    gstk_db:insert_opt(DB,Gstkid,{coords,Coords}),
-    out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
-	     [TkW, " coords ", AItem," ",gstk_canvas:coords(Coords),$;|C]).
-gen_citem_coords(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
-    gstk_db:opt(DB,Gstkid, coords).
+gen_citem_coords(Coords, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    gstk_db:insert_opt(DB, Gstkid, {coords, Coords}),
+    out_opts(Opts, Gstkid, TkW, DB, AItem, S, P, [TkW, " coords ", AItem, " ", gstk_canvas:coords(Coords), $;|C]).
 
-gen_citem_fill(none,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,AItem,[" -f {}"|S],P,C);
-gen_citem_fill(Color,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,AItem,[" -f ",gstk:to_color(Color)|S],P,C).
-gen_citem_fill(_Opt,_Gstkid,TkW,_DB,AItem) ->
-    tcl2erl:ret_color([TkW, " itemcg ", AItem, " -f"]).
+gen_citem_coords(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, coords).
 
-gen_citem_lower(_,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
-	     [TkW, " lower ", AItem,$;|C]).
+gen_citem_fill(none, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, AItem, [" -f {}"|S], P, C);
+gen_citem_fill(Color, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, AItem, [" -f ", gstk:to_color(Color)|S], P, C).
+gen_citem_fill(_Opt, _Gstkid, TkW, _DB, AItem) -> tcl2erl:ret_color([TkW, " itemcg ", AItem, " -f"]).
 
-gen_citem_raise(_,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
-	     [TkW, " raise ", AItem,$;|C]).
+gen_citem_lower(_, Opts, Gstkid, TkW, DB, AItem, S, P, C) -> gen_citem(" lower ", Opts, Gstkid, TkW, DB, AItem, S, P, C).
 
-gen_citem_move({Dx,Dy},Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    NewCoords = move_coords(Dx,Dy,gstk_db:opt(DB,Gstkid,coords)),
-    gstk_db:insert_opt(DB,Gstkid,NewCoords),
-    out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
-	     [TkW, " move ", AItem, " ",
-	      gstk:to_ascii(Dx), " ", gstk:to_ascii(Dy),$;|C]).
+gen_citem_raise(_, Opts, Gstkid, TkW, DB, AItem, S, P, C) -> gen_citem(" raise ", Opts, Gstkid, TkW, DB, AItem, S, P, C).
 
-move_coords(Dx,Dy,Coords) ->
-    Coords2 = add_to_coords(Dx,Dy, Coords),
-    {coords,Coords2}.
+gen_citem(Str, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, AItem, S, P, [TkW, Str, AItem, $;|C]).
 
-add_to_coords(Dx,Dy,[{X,Y}|Coords]) ->
-    [{X+Dx,Y+Dy}|add_to_coords(Dx,Dy,Coords)];
-add_to_coords(_,_,[]) -> [].
+gen_citem_move({Dx, Dy}, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    gstk_db:insert_opt(DB, Gstkid, move_coords(Dx, Dy, gstk_db:opt(DB, Gstkid, coords))),
+    out_opts(Opts, Gstkid, TkW, DB, AItem, S, P,
+	     [TkW, " move ", AItem, " ", gstk:to_ascii(Dx), " ", gstk:to_ascii(Dy), $;|C]).
 
+move_coords(Dx, Dy, Coords) -> {coords, add_to_coords(Dx, Dy, Coords)}.
 
-gen_citem_setfocus(true,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
-	     [TkW, " focus ", AItem,$;|C]);
-gen_citem_setfocus(false,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
-	     [TkW, " focus {}",$;|C]).
-gen_citem_setfocus(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
-    tcl2erl:ret_focus(gstk:to_ascii(bug_aitem),[TkW, " focus"]).
+add_to_coords(Dx, Dy, [{X, Y}|Coords]) -> [{X + Dx, Y + Dy}|add_to_coords(Dx, Dy, Coords)];
+add_to_coords(_, _, []) -> [].
 
-gen_citem_buttonpress(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
-	     [item_bind(DB, Gstkid, TkW, AItem,buttonpress, On),$;|C]).
-gen_citem_buttonrelease(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
-	     [item_bind(DB,Gstkid,TkW,AItem,buttonrelease, On),$;|C]).
-gen_citem_enter(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
-	     [item_bind(DB, Gstkid, TkW, AItem, enter, On),$;|C]).
+gen_citem_setfocus(true, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, AItem, S, P, [TkW, " focus ", AItem, $;|C]);
+gen_citem_setfocus(false, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    out_opts(Opts, Gstkid, TkW, DB, AItem, S, P, [TkW, " focus {}", $;|C]).
+gen_citem_setfocus(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_focus(gstk:to_ascii(bug_aitem), [TkW, " focus"]).
 
-gen_citem_keypress(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
-	     [item_bind(DB, Gstkid, TkW, AItem, keypress, On),$;|C]).
-gen_citem_keyrelease(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
-	     [item_bind(DB, Gstkid, TkW, AItem, keyrelease, On),$;|C]).
+gen_citem_buttonpress(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, buttonpress).
 
-gen_citem_leave(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
-	     [item_bind(DB, Gstkid, TkW, AItem, leave, On),$;|C]).
-gen_citem_motion(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
-    out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
-	     [item_bind(DB, Gstkid, TkW, AItem, motion, On),$;|C]).
+gen_citem_buttonrelease(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, buttonrelease).
 
+gen_citem_enter(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, enter).
 
-scrolls_vh(W, V,       true) -> scrolls_vh(W, V, bottom);
-scrolls_vh(W, true,       H) -> scrolls_vh(W, left, H);
-scrolls_vh(W, left,  bottom) -> ["so_bottom_left ",W];
-scrolls_vh(W, left,     top) -> ["so_top_left ",W];
-scrolls_vh(W, left,       _) -> ["so_left ",W];
-scrolls_vh(W, right, bottom) -> ["so_bottom_right ",W];
-scrolls_vh(W, right,    top) -> ["so_top_right ",W];
-scrolls_vh(W, right,      _) -> ["so_right ",W];
-scrolls_vh(W, _,     bottom) -> ["so_bottom ",W];
-scrolls_vh(W, _,        top) -> ["so_top ",W];
-scrolls_vh(W, _,          _) -> ["so_plain ",W].
+gen_citem_keypress(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, keypress).
+
+gen_citem_keyrelease(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, keyrelease).
+
+gen_citem_leave(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, leave).
+
+gen_citem_motion(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+    gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, motion).
+
+gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, T) ->
+    out_opts(Opts, Gstkid, TkW, DB, AItem, S, P, [item_bind(DB, Gstkid, TkW, AItem, T, On), $;|C]).
+
+scrolls_vh(W, V, true) -> scrolls_vh(W, V, bottom);
+scrolls_vh(W, true, H) -> scrolls_vh(W, left, H);
+scrolls_vh(W, left, bottom) -> ["so_bottom_left ", W];
+scrolls_vh(W, left, top) -> ["so_top_left ", W];
+scrolls_vh(W, left, _) -> ["so_left ", W];
+scrolls_vh(W, right, bottom) -> ["so_bottom_right ", W];
+scrolls_vh(W, right, top) -> ["so_top_right ", W];
+scrolls_vh(W, right, _) -> ["so_right ", W];
+scrolls_vh(W, _, bottom) -> ["so_bottom ", W];
+scrolls_vh(W, _, top) -> ["so_top ", W];
+scrolls_vh(W, _, _) -> ["so_plain ", W].
 
 %% create version
 parse_scrolls(Opts) ->
     {Vscroll, Hscroll, NewOpts} = parse_scrolls(Opts, false, false, []),
-    {Vscroll, Hscroll, [{scrolls, {Vscroll, Hscroll}} | NewOpts]}.
+    {Vscroll, Hscroll, [{scrolls, {Vscroll, Hscroll}}|NewOpts]}.
 
 %% config version
-parse_scrolls(Gstkid, Opts) ->
-    SO = Gstkid#gstkid.widget_data,
-    Vscroll = SO#so.vscroll,
-    Hscroll = SO#so.hscroll,
+parse_scrolls(#gstkid{widget_data = #so{vscroll = Vscroll, hscroll = Hscroll}}, Opts) ->
     case parse_scrolls(Opts, Vscroll, Hscroll, []) of
 	{Vscroll, Hscroll, Opts} -> Opts;
-	{NewVscroll, NewHscroll, NewOpts} -> 
-	    [{scrolls, {NewVscroll, NewHscroll}} | NewOpts]
+	{NewVscroll, NewHscroll, NewOpts} -> [{scrolls, {NewVscroll, NewHscroll}}|NewOpts]
     end.
 
-
-parse_scrolls([Option | Rest], Vscroll, Hscroll, Opts) when is_tuple(Option) ->
-    case element(1, Option) of
-	vscroll ->
-	    parse_scrolls(Rest, element(2, Option), Hscroll, Opts);
-	hscroll ->
-	    parse_scrolls(Rest, Vscroll, element(2, Option), Opts);
-	_ ->
-	    parse_scrolls(Rest, Vscroll, Hscroll, [Option | Opts])
-    end;
-
-parse_scrolls([Option | Rest], Vscroll, Hscroll, Opts) ->
-    parse_scrolls(Rest, Vscroll, Hscroll, [Option | Opts]);
-
-parse_scrolls([], Vscroll, Hscroll, Opts) ->
-    {Vscroll, Hscroll, Opts}.
-
+parse_scrolls([Option|Rest], _Vscroll, Hscroll, Opts) when element(1, Option) =:= vscroll ->
+    parse_scrolls(Rest, element(2, Option), Hscroll, Opts);
+parse_scrolls([Option|Rest], Vscroll, _Hscroll, Opts) when element(1, Option) =:= hscroll ->
+    parse_scrolls(Rest, Vscroll, element(2, Option), Opts);
+parse_scrolls([Option|Rest], Vscroll, Hscroll, Opts) -> parse_scrolls(Rest, Vscroll, Hscroll, [Option|Opts]);
+parse_scrolls([], Vscroll, Hscroll, Opts) -> {Vscroll, Hscroll, Opts}.
 
 %%
 %% Event bind main function
@@ -895,27 +743,13 @@ parse_scrolls([], Vscroll, Hscroll, Opts
 %%
 %% WS = Widget suffix for complex widgets
 %%
-bind(DB, Gstkid, TkW, Etype, On) ->
-    WD = Gstkid#gstkid.widget_data,
-    TkW2 = if is_record(WD, so) ->
-		   WD#so.object;
-	      true -> TkW
-	   end,
-    case bind(DB, Gstkid, TkW2, Etype, On, "") of
-	invalid_option -> invalid_option;
-	Cmd ->
-	    Cmd
-    end.
-
-bind(DB, Gstkid, TkW, Etype, On, WS) ->
-    case On of
-	true  -> ebind(DB, Gstkid, TkW, Etype, WS, "");
-	false -> eunbind(DB, Gstkid, TkW, Etype, WS, "");
-	{true, Edata} -> ebind(DB, Gstkid, TkW, Etype, WS, Edata);
-	{false, Edata} -> eunbind(DB, Gstkid, TkW, Etype, WS, Edata);
-	_     -> invalid_option
-    end.
+bind(DB, #gstkid{widget_data = #so{object = TkW}} = Gstkid, _TkW, Etype, On) -> bind(DB, Gstkid, TkW, Etype, On, "");
+bind(DB, Gstkid, TkW, Etype, On) -> bind(DB, Gstkid, TkW, Etype, On, "").
 
+bind(DB, Gstkid, TkW, Etype, {true, Edata}, WS) -> ebind(DB, Gstkid, TkW, Etype, WS, Edata);
+bind(DB, Gstkid, TkW, Etype, {false, Edata}, WS) -> eunbind(DB, Gstkid, TkW, Etype, WS, Edata);
+bind(DB, Gstkid, TkW, Etype, On, WS) when is_boolean(On) -> bind(DB, Gstkid, TkW, Etype, {On, ""}, WS);
+bind(_DB, _Gstkid, _TkW, _Etype, _On, _WS) -> invalid_option.
 
 %%
 %% Event bind on
@@ -927,36 +761,24 @@ bind(DB, Gstkid, TkW, Etype, On, WS) ->
 ebind(DB, Gstkid, TkW, Etype, WS, Edata) ->
     Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
     P = ["bind ", TkW, WS],
-    Cmd = case Etype of
-	      motion -> [P, " <Motion> {erlsend ", Eref, " %x %y}"];
-	      keypress ->
-		  [P, " <KeyPress> {erlsend ", Eref," %K %N 0 0};",
-		   P, " <Shift-KeyPress> {erlsend ", Eref, " %K %N 1 0};",
-		   P, " <Control-KeyPress> {erlsend ", Eref, " %K %N 0 1};",
-		   P," <Control-Shift-KeyPress> {erlsend ", Eref," %K %N 1 1}"];
-	      keyrelease ->
-		  [P, " <KeyRelease> {erlsend ", Eref," %K %N 0 0};",
-		   P, " <Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 0};",
-		   P, " <Control-KeyRelease> {erlsend ", Eref, " %K %N 0 1};",
-		   P," <Control-Shift-KeyRelease> {erlsend ",Eref," %K %N 1 1}"];
-	      buttonpress ->
-		  [P, " <ButtonPress> {erlsend ", Eref, " %b %x %y}"];
-	      buttonrelease ->
-		  [P, " <ButtonRelease> {erlsend ", Eref, " %b %x %y}"];
-	      leave -> [P, " <Leave> {erlsend ", Eref, "}"];
-	      enter -> [P, " <Enter> {erlsend ", Eref, "}"];
-	      destroy ->
-		  [P, " <Destroy> {if {\"%W\"==\"", [TkW, WS], 
-		   "\"} {erlsend ", Eref, "}}"];
-	      focus ->
-		  [P, " <FocusIn> {erlsend ", Eref, " 1};" ,
-		   P, " <FocusOut> {erlsend ", Eref, " 0}"];
-	      configure ->
-		  [P, " <Configure> {if {\"%W\"==\"", [TkW, WS], 
-		   "\"} {erlsend ", Eref, " %w %h %x %y}}"]
-	  end,
-    Cmd.
-
+    case Etype of
+	motion -> [P, " <Motion> {erlsend ", Eref, " %x %y}"];
+	keypress -> [P, " <KeyPress> {erlsend ", Eref, " %K %N 0 0};",
+		     P, " <Shift-KeyPress> {erlsend ", Eref, " %K %N 1 0};",
+		     P, " <Control-KeyPress> {erlsend ", Eref, " %K %N 0 1};",
+		     P, " <Control-Shift-KeyPress> {erlsend ", Eref, " %K %N 1 1}"];
+	  keyrelease -> [P, " <KeyRelease> {erlsend ", Eref, " %K %N 0 0};",
+			 P, " <Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 0};",
+			 P, " <Control-KeyRelease> {erlsend ", Eref, " %K %N 0 1};",
+			 P, " <Control-Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 1}"];
+	buttonpress -> [P, " <ButtonPress> {erlsend ", Eref, " %b %x %y}"];
+	buttonrelease -> [P, " <ButtonRelease> {erlsend ", Eref, " %b %x %y}"];
+	leave -> [P, " <Leave> {erlsend ", Eref, "}"];
+	enter -> [P, " <Enter> {erlsend ", Eref, "}"];
+	destroy -> [P, " <Destroy> {if {\"%W\"==\"", [TkW, WS], "\"} {erlsend ", Eref, "}}"];
+	focus -> [P, " <FocusIn> {erlsend ", Eref, " 1};" , P, " <FocusOut> {erlsend ", Eref, " 0}"];
+	configure -> [P, " <Configure> {if {\"%W\"==\"", [TkW, WS], "\"} {erlsend ", Eref, " %w %h %x %y}}"]
+    end.
 
 %%
 %% Unbind event
@@ -969,49 +791,29 @@ ebind(DB, Gstkid, TkW, Etype, WS, Edata)
 eunbind(DB, Gstkid, TkW, Etype, WS, _Edata) ->
     gstk_db:delete_event(DB, Gstkid, Etype),
     P = ["bind ", TkW, WS],
-    Cmd = case Etype of
-	      motion ->
-		  [P, " <Motion> {}"];
-	      keypress -> 
-		  [P, " <KeyPress> {};",
-		   P, " <Shift-KeyPress> {};",
-		   P, " <Control-KeyPress> {};",
-		   P, " <Control-Shift-KeyPress> {}"];
-	      keyrelease -> 
-		  [P, " <KeyRelease> {};",
-		   P, " <Shift-KeyRelease> {};",
-		   P, " <Control-KeyRelease> {};",
-		   P, " <Control-Shift-KeyRelease> {}"];
-	      buttonpress ->
-		  [P, " <ButtonPress> {}"];
-	      buttonrelease ->
-		  [P, " <ButtonRelease> {}"];
-	      leave ->
-		  [P, " <Leave> {}"];
-	      enter ->
-		  [P, " <Enter> {}"];
-	      destroy ->
-		  [P, " <Destroy> {}"];
-	      focus ->
-		  [P, " <FocusIn> {};",
-		   P, " <FocusOut> {}"];
-	      configure ->
-		  [P, " <Configure> {}"]
-	  end,
-    Cmd.
-
+    case Etype of
+	motion -> [P, " <Motion> {}"];
+	keypress -> [P, " <KeyPress> {};", P, " <Shift-KeyPress> {};",
+		     P, " <Control-KeyPress> {};", P, " <Control-Shift-KeyPress> {}"];
+	keyrelease -> [P, " <KeyRelease> {};", P, " <Shift-KeyRelease> {};",
+		       P, " <Control-KeyRelease> {};", P, " <Control-Shift-KeyRelease> {}"];
+	buttonpress -> [P, " <ButtonPress> {}"];
+	buttonrelease -> [P, " <ButtonRelease> {}"];
+	leave -> [P, " <Leave> {}"];
+	enter -> [P, " <Enter> {}"];
+	destroy -> [P, " <Destroy> {}"];
+	focus -> [P, " <FocusIn> {};", P, " <FocusOut> {}"];
+	configure -> [P, " <Configure> {}"]
+    end.
 
 %%
 %% Event item bind main function
 %%
 %% Should return a list of tcl commands or invalid_option
 %%
-item_bind(DB, Gstkid, Canvas, Item, Etype, On) ->
-    case On of
-	true          -> item_ebind(DB, Gstkid, Canvas, Item, Etype, "");
-	{true, Edata} -> item_ebind(DB, Gstkid, Canvas, Item, Etype, Edata);
-	_Other         -> item_eunbind(DB, Gstkid, Canvas, Item, Etype)
-    end.
+item_bind(DB, Gstkid, Canvas, Item, Etype, {true, Edata}) -> item_ebind(DB, Gstkid, Canvas, Item, Etype, Edata);
+item_bind(DB, Gstkid, Canvas, Item, Etype, true) -> item_bind(DB, Gstkid, Canvas, Item, Etype, {true, ""});
+item_bind(DB, Gstkid, Canvas, Item, Etype, _On) -> item_eunbind(DB, Gstkid, Canvas, Item, Etype).
 
 %%
 %% Event bind on
@@ -1022,37 +824,31 @@ item_ebind(DB, Gstkid, Canvas, Item, Ety
     Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
     P = [Canvas, " bind ", Item],
     case Etype of
-	enter  -> [P, " <Enter> {erlsend ", Eref, "}"];
-	leave  -> [P, " <Leave> {erlsend ", Eref, "}"];
-	motion -> [P, " <Motion> {erlsend ", Eref, " [",
-		   Canvas, " canvasx %x] [", Canvas, " canvasy %y] %x %y}"];
-	keypress ->
-	    [P, " <Key> {erlsend ", Eref," %K %N 0 0 [",
-	     Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
-	     P, " <Shift-Key> {erlsend ", Eref, " %K %N 1 0 [",
-	     Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
-	     P, " <Control-Key> {erlsend ", Eref, " %K %N 0 1 [",
-	     Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
-	     P, " <Control-Shift-Key> {erlsend ", Eref," %K %N 1 1 [",
-	     Canvas, " canvasx %x] [", Canvas, " canvasy %y]}"];
-	keyrelease ->
-	    [P, " <KeyRelease> {erlsend ", Eref," %K %N 0 0 [",
-	     Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
-	     P, " <Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 0 [",
-	     Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
-	     P, " <Control-KeyRelease> {erlsend ", Eref, " %K %N 0 1 [",
-	     Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
-	     P, " <Control-Shift-KeyRelease> {erlsend ", Eref," %K %N 1 1[",
-	     Canvas, " canvasx %x] [", Canvas, " canvasy %y]}"];
-	buttonpress ->
-	    [P, " <Button> {erlsend ", Eref, " %b [",
-	     Canvas, " canvasx %x] [", Canvas, " canvasy %y] %x %y}"];
-	buttonrelease ->
-	    [P, " <ButtonRelease> {erlsend ", Eref, " %b [",
-	     Canvas, " canvasx %x] [", Canvas, " canvasy %y] %x %y}"]
+	enter -> [P, " <Enter> {erlsend ", Eref, "}"];
+	leave -> [P, " <Leave> {erlsend ", Eref, "}"];
+	motion -> [P, " <Motion> {erlsend ", Eref, " [", Canvas, " canvasx %x] [", Canvas, " canvasy %y] %x %y}"];
+	keypress -> [P, " <Key> {erlsend ", Eref, " %K %N 0 0 [",
+		     Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
+		     P, " <Shift-Key> {erlsend ", Eref, " %K %N 1 0 [",
+		     Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
+		     P, " <Control-Key> {erlsend ", Eref, " %K %N 0 1 [",
+		     Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
+		     P, " <Control-Shift-Key> {erlsend ", Eref, " %K %N 1 1 [",
+		     Canvas, " canvasx %x] [", Canvas, " canvasy %y]}"];
+	keyrelease -> [P, " <KeyRelease> {erlsend ", Eref, " %K %N 0 0 [",
+		       Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
+		       P, " <Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 0 [",
+		       Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
+		       P, " <Control-KeyRelease> {erlsend ", Eref, " %K %N 0 1 [",
+		       Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
+		       P, " <Control-Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 1[",
+		       Canvas, " canvasx %x] [", Canvas, " canvasy %y]}"];
+	buttonpress -> [P, " <Button> {erlsend ", Eref, " %b [",
+			Canvas, " canvasx %x] [", Canvas, " canvasy %y] %x %y}"];
+	buttonrelease -> [P, " <ButtonRelease> {erlsend ", Eref, " %b [",
+			  Canvas, " canvasx %x] [", Canvas, " canvasy %y] %x %y}"]
     end.
 
-
 %%
 %% Unbind event
 %%
@@ -1062,28 +858,17 @@ item_ebind(DB, Gstkid, Canvas, Item, Ety
 item_eunbind(DB, Gstkid, Canvas, Item, Etype) ->
     gstk_db:delete_event(DB, Gstkid, Etype),
     P = [Canvas, " bind ", Item],
-    Cmd = case Etype of
-	      enter         -> [P, " <Enter> {}"];
-	      leave         -> [P, " <Leave> {}"];
-	      motion        -> [P, " <Motion> {}"];
-	      keypress -> 
-		  [P, " <KeyPress> {};",
-		   P, " <Shift-KeyPress> {};",
-		   P, " <Control-KeyPress> {};",
-		   P, " <Control-Shift-KeyPress> {}"];
-	      keyrelease -> 
-		  [P, " <KeyRelease> {};",
-		   P, " <Shift-KeyRelease> {};",
-		   P, " <Control-KeyRelease> {};",
-		   P, " <Control-Shift-KeyRelease> {}"];
-	      buttonpress   -> [P, " <Button> {}"];
-	      buttonrelease -> [P, " <ButtonRelease> {}"]
-	  end,
-    Cmd.
-
-
+    case Etype of
+	enter -> [P, " <Enter> {}"];
+	leave -> [P, " <Leave> {}"];
+	motion -> [P, " <Motion> {}"];
+	keypress -> [P, " <KeyPress> {};", P, " <Shift-KeyPress> {};",
+		     P, " <Control-KeyPress> {};", P, " <Control-Shift-KeyPress> {}"];
+	keyrelease -> [P, " <KeyRelease> {};", P, " <Shift-KeyRelease> {};",
+		       P, " <Control-KeyRelease> {};", P, " <Control-Shift-KeyRelease> {}"];
+	buttonpress -> [P, " <Button> {}"];
+	buttonrelease -> [P, " <ButtonRelease> {}"]
+    end.
 
-event(DB, Gstkid, Etype, _Edata, Args) ->
-    #gstkid{owner=Ow,id=Id} = Gstkid,
-    Data = gstk_db:opt(DB,Gstkid,data),
-    gs_frontend:event(get(gs_frontend),Ow,{gs,Id,Etype,Data,Args}).
+event(DB, #gstkid{owner = Ow, id = Id} = Gstkid, Etype, _Edata, Args) ->
+    gs_frontend:event(get(gs_frontend), Ow, {gs, Id, Etype, gstk_db:opt(DB, Gstkid, data), Args}).
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_grid.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_grid.erl
--- otp_src_19.0.5/lib/gs/src/gstk_grid.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_grid.erl	2016-08-25 16:37:44.564693354 +0300
@@ -20,10 +20,10 @@
 
 %%
 -module(gstk_grid).
--compile([{nowarn_deprecated_function,{gs,val,2}}]).
 
--export([event/5,create/3,config/3,option/5,read/3,delete/2,destroy/2,
-	 mk_create_opts_for_child/4,read_option/5]).
+-compile([{nowarn_deprecated_function, {gs, val, 2}}]).
+
+-export([event/5, create/3, config/3, option/5, read/3, delete/2, destroy/2, mk_create_opts_for_child/4, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -42,243 +42,178 @@
 %%	bg		Color
 %%-----------------------------------------------------------------------------
 
--record(state,{canvas,ncols,max_range,cell_id, cell_pos,ids,db,tkcanvas}).
--record(item,{text_id,rect_id,line_id}).
+-record(state, {canvas, ncols, max_range, cell_id, cell_pos, ids, db, tkcanvas}).
+-record(item, {text_id, rect_id, line_id}).
 
 %%======================================================================
 %% Interfaces
 %%======================================================================
 
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_gridline:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_gridline:event(DB, Gstkid, Etype, Edata, Args).
 
-create(DB, Gstkid, Options) ->
-    WinParent=Gstkid#gstkid.parent,
-    {OtherOpts,CanvasOpts} = parse_opts(Options,[],[]),
+create(DB, #gstkid{parent = WinParent} = Gstkid, Options) ->
+    {CanvasOpts, OtherOpts} = parse_opts(Options),
     %% Why this (secret) hack? Performance reasons.
     %% if we ".canvas bind all" once and for all, then we can
     %% create lines twice as fast since we don't have to bind each line.
     C = make_ref(),
-    gstk:create_impl(DB,{a_grid, {canvas,C,WinParent,
-				 [{secret_hack_gridit, Gstkid}
-				  | CanvasOpts]}}),
-    CanvasGstkid = gstk_db:lookup_gstkid(DB, C),
-    Wid = CanvasGstkid#gstkid.widget,
-    SO = CanvasGstkid#gstkid.widget_data,
-    TkCanvas = SO#so.object,
-    CI=ets:new(gstk_grid_cellid,[private,set]),
-    CP=ets:new(gstk_grid_cellpos,[private,set]),
-    IDs=ets:new(gstk_grid_id,[private,set]),
-    S=#state{db=DB,ncols=length(gs:val(columnwidths,OtherOpts)),
-	     canvas=C,cell_id=CI,tkcanvas=TkCanvas,cell_pos=CP,ids=IDs},
-    Ngstkid = Gstkid#gstkid{widget=Wid,widget_data=S},
-    gstk_db:insert_opts(DB,Ngstkid,OtherOpts),
-    gstk_db:insert_widget(DB,Ngstkid),
-    gstk_generic:mk_cmd_and_exec(lists:keydelete(columnwidths,1,OtherOpts),
-				Ngstkid, TkCanvas,"","", DB,nop).
+    gstk:create_impl(DB, {a_grid, {canvas, C, WinParent, [{secret_hack_gridit, Gstkid}|CanvasOpts]}}),
+    #gstkid{widget = Wid, widget_data = #so{object = TkCanvas}} = gstk_db:lookup_gstkid(DB, C),
+    Ngstkid = Gstkid#gstkid{widget = Wid, widget_data = #state{db = DB, ncols = length(gs:val(columnwidths, OtherOpts)),
+							       canvas = C, tkcanvas = TkCanvas,
+							       cell_id = ets:new(gstk_grid_cellid, [private, set]),
+							       cell_pos = ets:new(gstk_grid_cellpos, [private, set]),
+							       ids = ets:new(gstk_grid_id, [private, set])}},
+    gstk_db:insert_opts(DB, Ngstkid, OtherOpts),
+    gstk_db:insert_widget(DB, Ngstkid),
+    gstk_generic:mk_cmd_and_exec(lists:keydelete(columnwidths, 1 , OtherOpts), Ngstkid, TkCanvas, "", "", DB, nop).
 
-config(DB, Gstkid, Options) ->
-    #gstkid{widget=TkW,widget_data=State}=Gstkid,
-    {OtherOpts,CanvasOpts} = parse_opts(Options,[],[]),
-    case gstk:config_impl(DB,State#state.canvas,CanvasOpts) of
-	ok ->
-	    SimplePreCmd = "nyi?",
-	    PlacePreCmd = [";place ", TkW],
-	    gstk_generic:mk_cmd_and_exec(OtherOpts,Gstkid,TkW,
-					SimplePreCmd,PlacePreCmd,DB,State);
+config(DB, #gstkid{widget = TkW, widget_data = #state{canvas = Canvas} = State} = Gstkid, Options) ->
+    {CanvasOpts, OtherOpts} = parse_opts(Options),
+    case gstk:config_impl(DB, Canvas, CanvasOpts) of
+	ok -> gstk_generic:mk_cmd_and_exec(OtherOpts, Gstkid, TkW, "nyi?", [";place ", TkW], DB, State);
 	Err -> Err
     end.
-    
 
-option(Option, Gstkid, _TkW, DB,State) ->
-    case Option of
-	{rows,{From,To}} ->
-	    Ngstkid = reconfig_rows(From,To,Gstkid),
-	    gstk_db:insert_opt(DB,Gstkid,Option),
-	    gstk_db:update_widget(DB,Ngstkid),
-	    {none,Ngstkid};
-	{fg,_Color} ->
-	    reconfig_grid(DB,Option,State),
-	    gstk_db:insert_opt(DB,Gstkid,Option),
-	    none;
-	{bg,_Color} ->
-	    reconfig_grid(DB,Option,State),
-	    gstk_db:insert_opt(DB,Gstkid,Option),
-	    none;
-	{font,_Font} ->
-	    reconfig_grid(DB,Option,State),
-	    gstk_db:insert_opt(DB,Gstkid,Option),
-	    none;
-	{columnwidths,ColWs} ->
-	    gstk_db:insert_opt(DB,Gstkid,Option),
-	    Rows = gstk_db:opt(DB,Gstkid,rows),
-	    CellHeight = gstk_db:opt(DB,Gstkid,cellheight),
-	    gstk:config_impl(DB,State#state.canvas,
-			    [calc_scrollregion(Rows,ColWs,CellHeight)]),
-	    %% Crash upon an error msg (so we know WHY)
-	    {result,_} = gstk:call(["resize_grid_cols ",State#state.tkcanvas,
-				   " [list ",asc_tcl_colw(ColWs),"]"]),
-	    none;
-	{cellheight,_Height} ->
-	    gstk_db:insert_opt(DB,Gstkid,Option),
-	    none;	
-	_ ->
-	    invalid_option
-    end.
+option(Option, Gstkid, _TkW, DB, State) -> option(DB, Gstkid, Option, State).
 
-reconfig_grid(_,_,nop) -> done;
-reconfig_grid(DB,Option,#state{tkcanvas=TkW,cell_pos=CP,
-			       ncols=Ncols,max_range={From,To}}) ->
-    reconfig_grid(DB,TkW,Option,From,To,CP,Ncols).
-    
-reconfig_grid(DB,TkW,Opt,Row,MaxRow,CellPos,Ncols) when Row =< MaxRow ->
-    [{_,Item}] = ets:lookup(CellPos,{1,Row}),
-    case Item#item.line_id of
-	free -> empty_cell_config(DB,TkW,Row,1,Ncols,CellPos,Opt);
-	GridLine ->
-	    gstk_gridline:config(DB,gstk_db:lookup_gstkid(DB,GridLine),
-				[Opt])
+option(DB, Gstkid, {columnwidths, ColWs} = Option, #state{canvas = Canvas, tkcanvas = TkCanvas}) ->
+    gstk_db:insert_opt(DB, Gstkid, Option),
+    gstk:config_impl(DB, Canvas,
+		     [calc_scrollregion(gstk_db:opt(DB, Gstkid, rows), ColWs, gstk_db:opt(DB, Gstkid, cellheight))]),
+    %% Crash upon an error msg (so we know WHY)
+    {result, _} = gstk:call(["resize_grid_cols ", TkCanvas, " [list ", asc_tcl_colw(ColWs), "]"]),
+    none;
+option(DB, Gstkid, {O, _Color} = Option, State) when O =:= fg; O =:= bg; O =:= font ->
+    reconfig_grid(DB, Option, State),
+    gstk_db:insert_opt(DB, Gstkid, Option),
+    none;
+option(DB, Gstkid, Option, _State) -> option(DB, Gstkid, Option).
+
+option(DB, Gstkid, {rows, {From, To}} = Option) ->
+    Ngstkid = reconfig_rows(From, To, Gstkid),
+    gstk_db:insert_opt(DB, Gstkid, Option),
+    gstk_db:update_widget(DB, Ngstkid),
+    {none, Ngstkid};
+option(DB, Gstkid, {cellheight, _Height} = Option) ->
+    gstk_db:insert_opt(DB, Gstkid, Option),
+    none;
+option(_DB, _Gstkid, _Option) -> invalid_option.
+
+reconfig_grid(_, _, nop) -> done;
+reconfig_grid(DB, Option, #state{tkcanvas = TkW, cell_pos = CP, ncols = Ncols, max_range = {From, To}}) ->
+    reconfig_grid(DB, TkW, Option, From, To, CP, Ncols).
+
+reconfig_grid(DB, TkW, Opt, Row, MaxRow, CellPos, Ncols) when Row =< MaxRow ->
+    case ets:lookup(CellPos, {1, Row}) of
+	[{_, #item{line_id = free}}] -> empty_cell_config(DB, TkW, Row, 1, Ncols, CellPos, Opt);
+	[{_, #item{line_id = GridLine}}] -> gstk_gridline:config(DB, gstk_db:lookup_gstkid(DB, GridLine), [Opt])
     end,
-    reconfig_grid(DB,TkW,Opt,Row+1,MaxRow,CellPos,Ncols);
-reconfig_grid(_,_,_,_,_,_,_) -> done.
+    reconfig_grid(DB, TkW, Opt, Row + 1, MaxRow, CellPos, Ncols);
+reconfig_grid(_, _, _, _, _, _, _) -> done.
 
 %%----------------------------------------------------------------------
 %% Purpose: Config an empty cell (i.e. has no gridline)
 %%----------------------------------------------------------------------
-empty_cell_config(DB,TkW,Row,Col,Ncols,CellPos,Opt) when Col =< Ncols ->
-    [{_,Item}] = ets:lookup(CellPos,{Col,Row}),
-    empty_cell_config(DB,TkW,Item,Opt),
-    empty_cell_config(DB,TkW,Row,Col+1,Ncols,CellPos,Opt);
-empty_cell_config(_,_,_,_,_,_,_) -> done.
+empty_cell_config(DB, TkW, Row, Col, Ncols, CellPos, Opt) when Col =< Ncols ->
+    [{_, Item}] = ets:lookup(CellPos, {Col, Row}),
+    empty_cell_config(DB, TkW, Item, Opt),
+    empty_cell_config(DB, TkW, Row, Col + 1, Ncols, CellPos, Opt);
+empty_cell_config(_, _, _, _, _, _, _) -> done.
 
-empty_cell_config(_,TkW,#item{rect_id=Rid},{bg,Color}) ->
-    gstk:exec([TkW," itemconf ",gstk:to_ascii(Rid)," -f ",gstk:to_color(Color)]);
-empty_cell_config(_,TkW,#item{rect_id=Rid,text_id=Tid},{fg,Color}) ->
+empty_cell_config(_, TkW, #item{rect_id = Rid}, {bg, Color}) ->
+    gstk:exec([TkW, " itemconf ", gstk:to_ascii(Rid), " -f ", gstk:to_color(Color)]);
+empty_cell_config(_, TkW, #item{rect_id = Rid, text_id = Tid}, {fg, Color}) ->
     Acolor = gstk:to_color(Color),
-    Pre = [TkW," itemconf "],
-    RectStr = [Pre, gstk:to_ascii(Rid)," -outline ",Acolor],
-    TexdStr = [Pre,  gstk:to_ascii(Tid)," -fi ",Acolor],
-    gstk:exec([RectStr,$;,TexdStr]);
-empty_cell_config(DB,TkW,#item{text_id=Tid},{font,Font}) ->
-    gstk:exec([TkW," itemconf ",gstk:to_ascii(Tid)," -font ",
-	      gstk_font:choose_ascii(DB,Font)]);
-empty_cell_config(_,_,_,_) -> done.
-
-
-
-reconfig_rows(From, To, Gstkid) ->
-    #gstkid{widget_data=State,id=Id} = Gstkid,
-    #state{tkcanvas=TkCanvas,cell_pos=CP,cell_id=CI,
-	   canvas=C,db=DB,max_range=Range}=State,
-    NewRange =
-	if Range == undefined ->
-		mkgrid(DB,CP,CI,TkCanvas,Id,From,To),
-		{From,To};
-	   true ->
-		{Top,Bot} = Range,
-		if
-		    From < Top -> % we need more rects above
-			mkgrid(DB,CP,CI,TkCanvas,Id,From,Top-1);
-		    true -> true
-		end,
-		if
-		    To > Bot ->   % we need more rects below
-			mkgrid(DB,CP,CI,TkCanvas,Id,Bot+1,To);
-		    true -> true
-		end,
-		{lists:min([Top, From]), lists:max([Bot, To])}
-	end,
-    gstk:config_impl(DB,C,[calc_scrollregion({From,To},
-					    gstk_db:opt(DB,Id,columnwidths),
-					    gstk_db:opt(DB,Id,cellheight))]),
-    S2 = State#state{max_range=NewRange},
-    Gstkid#gstkid{widget_data=S2}.
+    Pre = [TkW, " itemconf "],
+    gstk:exec([[Pre, gstk:to_ascii(Rid), " -outline ", Acolor], $;, [Pre, gstk:to_ascii(Tid), " -fi ", Acolor]]);
+empty_cell_config(DB, TkW, #item{text_id = Tid}, {font, Font}) ->
+    gstk:exec([TkW, " itemconf ", gstk:to_ascii(Tid), " -font ", gstk_font:choose_ascii(DB, Font)]);
+empty_cell_config(_, _, _, _) -> done.
 
-read(DB,Gstkid,Opt) ->
-    State = Gstkid#gstkid.widget_data,
-    case lists:member(Opt,[x,y,width,height,hscroll,vscroll]) of
-	true -> gstk:read_impl(DB,State#state.canvas,Opt);
-	false ->
-	    gstk_generic:read_option(DB, Gstkid, Opt,State)
-      end.
+reconfig_rows(From, To, #gstkid{widget_data = #state{tkcanvas = TkCanvas,
+						     cell_pos = CP,
+						     cell_id = CI,
+						     canvas = C,
+						     db = DB,
+						     max_range = Range} = State,
+				id = Id} = Gstkid) ->
+    NewRange = if
+		   Range =:= undefined ->
+		       mkgrid(DB, CP, CI, TkCanvas, Id, From, To),
+		       {From, To};
+		   true ->
+		       {Top, Bot} = Range,
+		       % we need more rects above
+		       From < Top andalso mkgrid(DB, CP, CI, TkCanvas, Id, From, Top - 1),
+		       % we need more rects below
+		       To > Bot andalso mkgrid(DB, CP, CI, TkCanvas, Id, Bot + 1, To),
+		       {lists:min([Top, From]), lists:max([Bot, To])}
+	       end,
+    gstk:config_impl(DB, C, [calc_scrollregion({From, To},
+			     gstk_db:opt(DB, Id, columnwidths),
+			     gstk_db:opt(DB, Id, cellheight))]),
+    Gstkid#gstkid{widget_data = State#state{max_range = NewRange}}.
 
-read_option(Option,Gstkid,_TkW,DB,State) -> 
-    case Option of
-	{obj_at_row,Row} ->
-	    case ets:lookup(State#state.cell_pos,{1,Row}) of
-		[{_pos,Item}] ->
-		    case Item#item.line_id of
-			free -> undefined;
-			GridLine ->
-			    gstk:make_extern_id(GridLine, DB)
-		    end;
-		_ -> undefined
-	    end;
-	Opt -> gstk_db:opt(DB,Gstkid#gstkid.id,Opt,undefined)
+read(DB, #gstkid{widget_data = State} = Gstkid, Opt) ->
+    case lists:member(Opt, [x, y, width, height, hscroll, vscroll]) of
+	true -> gstk:read_impl(DB, State#state.canvas, Opt);
+	_ -> gstk_generic:read_option(DB, Gstkid, Opt, State)
     end.
 
+read_option({obj_at_row, Row}, _Gstkid, _TkW, DB, #state{cell_pos = Pos}) ->
+    case ets:lookup(Pos, {1, Row}) of
+	[{_Pos, #item{line_id = free}}] -> undefined;
+	[{_Pos, #item{line_id = GridLine}}] -> gstk:make_extern_id(GridLine, DB);
+	_ -> undefined
+    end;
+read_option(Option, #gstkid{id = Id}, _TkW, DB, _State) -> gstk_db:opt(DB, Id, Option, undefined).
 
 %%----------------------------------------------------------------------
 %% Is always called.
 %% Clean-up my specific side-effect stuff.
 %%----------------------------------------------------------------------
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget_data = #state{canvas = C, cell_pos = CP, cell_id = CIs, ids = IDs},
+		   parent = Parent, id = Id} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    State = Gstkid#gstkid.widget_data,
-    #state{canvas=C,cell_pos=CP,cell_id=CIs, ids=IDs} = State,
-    ets:delete(CP),
-    ets:delete(CIs),
-    ets:delete(IDs),
-    {Gstkid#gstkid.parent, Gstkid#gstkid.id, gstk_grid, [C]}.
+    lists:foreach(fun ets:delete/1, [CP, CIs, IDs]),
+    {Parent, Id, gstk_grid, [C]}.
 
 %%----------------------------------------------------------------------
 %% Is called iff my parent is not also destroyed.
 %%----------------------------------------------------------------------
-destroy(DB, Canvas) ->
-    gstk:destroy_impl(DB,gstk_db:lookup_gstkid(DB,Canvas)).
+destroy(DB, Canvas) -> gstk:destroy_impl(DB, gstk_db:lookup_gstkid(DB, Canvas)).
 
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
-    gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+    gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
 
-mkgrid(DB,CellPos,CellIds,TkCanvas,Id,From,To) ->
-    ColWs = gstk_db:opt(DB,Id,columnwidths),
-    AscColW = ["[list ",asc_tcl_colw(ColWs),"]"],
-    Font = gstk_font:choose_ascii(DB,gstk_db:opt(DB,Id,font)),
-    Fg = gstk:to_color(gstk_db:opt(DB,Id,fg)),
-    Bg = gstk:to_color(gstk_db:opt(DB,Id,bg)),
-    Objs = tcl2erl:ret_list(["mkgrid ",TkCanvas," ",AscColW," ",
-			     gstk:to_ascii(From)," ",
-			     gstk:to_ascii(To)," ",
-			     gstk:to_ascii(gstk_db:opt(DB,Id,cellheight))," ",
-			     Font," ",Fg," ",Bg]),
-    insert_objs(CellPos,CellIds,From,To,1,length(ColWs)+1,Objs).
+mkgrid(DB, CellPos, CellIds, TkCanvas, Id, From, To) ->
+    ColWs = gstk_db:opt(DB, Id, columnwidths),
+    insert_objs(CellPos, CellIds, From, To, 1, length(ColWs) + 1,
+		tcl2erl:ret_list(["mkgrid ", TkCanvas, " ", ["[list ", asc_tcl_colw(ColWs), "]"], " ",
+				  gstk:to_ascii(From), " ", gstk:to_ascii(To), " ",
+				  gstk:to_ascii(gstk_db:opt(DB, Id, cellheight)), " ",
+				  gstk_font:choose_ascii(DB, gstk_db:opt(DB, Id, font)), " ",
+				  gstk:to_color(gstk_db:opt(DB, Id, fg)), " ", gstk:to_color(gstk_db:opt(DB, Id, bg))])).
 
-insert_objs(_,_,_,_,_,_,[]) -> done;
-insert_objs(CP,CI,Row,T,MaxCol,MaxCol,Objs) ->
-    insert_objs(CP,CI,Row+1,T,1,MaxCol,Objs);
-insert_objs(CellPos,CellIds,Row,To,Col,Ncols,[RectId,TextId|Objs]) ->
-    ets:insert(CellPos,{{Col,Row},
-		   #item{text_id=TextId,rect_id=RectId,line_id=free}}),
-    ets:insert(CellIds,{RectId,{Col,Row}}),
-    ets:insert(CellIds,{TextId,{Col,Row}}),
-    insert_objs(CellPos,CellIds,Row,To,Col+1,Ncols,Objs).
+insert_objs(_, _, _, _, _, _, []) -> done;
+insert_objs(CP, CI, Row, T, MaxCol, MaxCol, Objs) -> insert_objs(CP, CI, Row + 1, T, 1, MaxCol, Objs);
+insert_objs(CellPos, CellIds, Row, To, Col, Ncols, [RectId, TextId|Objs]) ->
+    CR = {Col, Row},
+    ets:insert(CellPos, {CR, #item{text_id = TextId, rect_id = RectId, line_id = free}}),
+    ets:insert(CellIds, {RectId, CR}),
+    ets:insert(CellIds, {TextId, CR}),
+    insert_objs(CellPos, CellIds, Row, To, Col + 1, Ncols, Objs).
 
 asc_tcl_colw([]) -> "";
-asc_tcl_colw([Int|T]) -> [gstk:to_ascii(Int)," "|asc_tcl_colw(T)].
+asc_tcl_colw([Int|T]) -> [gstk:to_ascii(Int), " "|asc_tcl_colw(T)].
 
 %%----------------------------------------------------------------------
 %% Args: Cols  list of column sizes (measured in n-chars)
 %%----------------------------------------------------------------------
 calc_scrollregion({From, To}, Cols, Height) ->
-    {scrollregion, {0, ((From-1) * Height) + From,
-		    lists:sum(Cols)+length(Cols)+1, (To * Height)+ To+1}}.
-
-parse_opts([],OtherOpts,CanvasOpts) -> {OtherOpts,CanvasOpts};
-parse_opts([{Key,Val}|Opts],OtherOpts,CanvasOpts) ->
-    case lists:member(Key,[x,y,width,height,vscroll,hscroll]) of
-	true -> parse_opts(Opts,OtherOpts,[{Key,Val}|CanvasOpts]);
-	false -> parse_opts(Opts,[{Key,Val}|OtherOpts],CanvasOpts)
-    end;
-parse_opts([Opt|Opts],OtherOpts,CanvasOpts) ->
-    parse_opts(Opts,[Opt|OtherOpts],CanvasOpts).
+    {scrollregion, {0, (From - 1) * Height + From, lists:sum(Cols) + length(Cols) + 1, To * Height + To + 1}}.
 
+parse_opts(Opts) -> lists:partition(fun({Key, _}) -> lists:member(Key, [x, y, width, height, vscroll, hscroll]);
+				       (_) -> false
+				    end, Opts).
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_gridline.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_gridline.erl
--- otp_src_19.0.5/lib/gs/src/gstk_gridline.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_gridline.erl	2016-08-25 16:37:44.564693354 +0300
@@ -20,15 +20,15 @@
 
 %%
 -module(gstk_gridline).
--compile([{nowarn_deprecated_function,{gs,val,2}},
-          {nowarn_deprecated_function,{gs,val,3}}]).
 
--export([event/5,create/3,config/3,option/5,read/3,delete/2,destroy/3,
-	read_option/5]).
+-compile([{nowarn_deprecated_function, {gs, val, 2}},
+          {nowarn_deprecated_function, {gs, val, 3}}]).
+
+-export([event/5, create/3, config/3, option/5, read/3, delete/2, destroy/3, read_option/5]).
 
 -include("gstk.hrl").
--record(state,{canvas,ncols,max_range,cell_id, cell_pos,ids,db,tkcanvas}).
--record(item,{text_id,rect_id,line_id}).
+-record(state, {canvas, ncols, max_range, cell_id, cell_pos, ids, db, tkcanvas}).
+-record(item, {text_id, rect_id, line_id}).
 
 %%-----------------------------------------------------------------------------
 %% 			    GRIDLINE OPTIONS
@@ -41,261 +41,216 @@
 %%
 %%-----------------------------------------------------------------------------
 
-create(DB, Gstkid, Options) ->
-    Pgstkid = gstk_db:lookup_gstkid(DB,Gstkid#gstkid.parent),
-    Id = Gstkid#gstkid.id,
-    #gstkid{widget_data=State} = Pgstkid,
-    #state{cell_pos=CP,tkcanvas=TkW,ncols=Ncols} = State,
-    Row = gs:val(row,Options),
-    case check_row(CP,Row) of
-	{error,Reason} -> {error,Reason};
+create(DB, #gstkid{parent = Parent} = Gstkid, Options) ->
+    #gstkid{widget_data = #state{cell_pos = CP}} = Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
+    Row = gs:val(row, Options),
+    case check_row(CP, Row) of
+	{error, _Reason} = E -> E;
 	ok ->
-	    Ngstkid = Gstkid#gstkid{widget=TkW},
-	    gstk_db:insert_opts(DB,Id,[{data,[]},{row,Row}]),
-	    update_cp_db(Ncols,Row,Id,CP),
-	    config_line(DB,Pgstkid,Ngstkid,Row,Options),
+	    #gstkid{widget_data = #state{tkcanvas = TkW, ncols = Ncols}} = Pgstkid,
+	    Ngstkid = Gstkid#gstkid{widget = TkW},
+	    Id = Gstkid#gstkid.id,
+	    gstk_db:insert_opts(DB, Id, [{data, []}, {row, Row}]),
+	    update_cp_db(Ncols, Row, Id, CP),
+	    config_line(DB, Pgstkid, Ngstkid, Row, Options),
 	    Ngstkid
     end.
 
 %%----------------------------------------------------------------------
 %% Returns: ok|false
 %%----------------------------------------------------------------------
-check_row(_CellPos,undefined) ->
-    {error,{gridline,{row,undefined}}};
-check_row(CellPos,Row) ->
-    case ets:lookup(CellPos,{1,Row}) of
-	[] ->
-	    {error,{gridline,row_outside_range,Row}};
-	[{_,Item}] ->
-	    case Item#item.line_id of
-		free -> ok;
-		_    ->
-		    {error,{gridline,row_is_occupied,Row}}
-	    end
+check_row(_CellPos, undefined) -> {error, {gridline, {row, undefined}}};
+check_row(CellPos, Row) ->
+    case ets:lookup(CellPos, {1, Row}) of
+	[] -> {error, {gridline, row_outside_range, Row}};
+	[{_, #item{line_id = free}}] -> ok;
+	[{_, #item{}}] -> {error, {gridline, row_is_occupied, Row}}
     end.
 
 %%----------------------------------------------------------------------
 %% s => text item
 %% p => rect item
 %%----------------------------------------------------------------------
-option(Option, _Gstkid, _TkW, DB,_) ->
-    case Option of
-	{{bg,_Item}, Color} -> {p,[" -f ", gstk:to_color(Color)]};
-	{{text,_Item},Text} -> {s, [" -te ", gstk:to_ascii(Text)]};
-	{{fg,_Item},Color} -> {sp,{[" -fi ", gstk:to_color(Color)],
-				  [" -outline ", gstk:to_color(Color)]}};
-	{{font,_Item},Font} -> {s,[" -font ",gstk_font:choose_ascii(DB,Font)]};
-	_ -> invalid_option
-    end.
+option(Option, _Gstkid, _TkW, DB, _) -> option(Option, DB).
+
+option({{font, _Item}, Font}, DB) -> option_s(" -font ", gstk_font:choose_ascii(DB, Font));
+option(Option, _DB) -> option(Option).
+
+option({{bg, _Item}, Color}) -> {p, [" -f ", gstk:to_color(Color)]};
+option({{text, _Item}, Text}) -> option_s(" -te ", gstk:to_ascii(Text));
+option({{fg, _Item}, Color}) -> {sp, {[" -fi ", gstk:to_color(Color)], [" -outline ", gstk:to_color(Color)]}};
+option(_Option) -> invalid_option.
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
 
 %%----------------------------------------------------------------------
 %% Is always called.
 %% Clean-up my specific side-effect stuff.
 %%----------------------------------------------------------------------
-delete(DB, Gstkid) ->
-    Row = gstk_db:opt(DB,Gstkid,row),
-    gstk_db:delete_widget(DB, Gstkid),    
-    {Gstkid#gstkid.parent, Gstkid#gstkid.id, gstk_gridline,[Gstkid, Row]}.
+delete(DB, #gstkid{parent = Parent, id = Id} = Gstkid) ->
+    Row = gstk_db:opt(DB, Gstkid, row),
+    gstk_db:delete_widget(DB, Gstkid),
+    {Parent, Id, gstk_gridline, [Gstkid, Row]}.
 
 %%----------------------------------------------------------------------
 %% Is called iff my parent is not also destroyed.
 %%----------------------------------------------------------------------
-destroy(DB, Lgstkid, Row) ->
-    Ggstkid = gstk_db:lookup_gstkid(DB,Lgstkid#gstkid.parent),
-    #gstkid{widget_data=State} = Ggstkid,
-    config_line(DB,Ggstkid,Lgstkid,Row,
-		[{bg,gstk_db:opt(DB,Ggstkid,bg)},
-		 {fg,gstk_db:opt(DB,Ggstkid,fg)},{text,""}]),
-    Ncols = State#state.ncols,
-    update_cp_db(Ncols,Row,free,State#state.cell_pos).
-
+destroy(DB, #gstkid{parent = Parent} = Lgstkid, Row) ->
+    #gstkid{widget_data = #state{ncols = Ncols, cell_pos = CP}} = Ggstkid = gstk_db:lookup_gstkid(DB, Parent),
+    config_line(DB, Ggstkid, Lgstkid, Row,
+		[{bg, gstk_db:opt(DB, Ggstkid, bg)}, {fg, gstk_db:opt(DB, Ggstkid, fg)}, {text, ""}]),
+    update_cp_db(Ncols, Row, free, CP).
 
-config(DB, Gstkid, Opts) ->
-    Pgstkid = gstk_db:lookup_gstkid(DB,Gstkid#gstkid.parent),
-    case {gs:val(row,Opts,missing),gstk_db:opt(DB,Gstkid,row)} of
-	{Row,Row} -> % stay here...
-	    config_line(DB,Pgstkid,Gstkid,Row,Opts);
-	{missing,Row} ->  % stay here...
-	    config_line(DB,Pgstkid,Gstkid,Row,Opts);
-	{NewRow,OldRow} ->
-	    config_line(DB,Pgstkid,Gstkid,OldRow,Opts),
-	    Ngstkid = gstk_db:lookup_gstkid(DB,Gstkid#gstkid.id),
-	    case move_line(NewRow,OldRow,DB,Pgstkid#gstkid.widget_data,Ngstkid) of
-		true -> 
-		    gstk_db:insert_opt(DB,Ngstkid,{row,NewRow}),
+config(DB, #gstkid{parent = Parent} = Gstkid, Opts) ->
+    Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
+    NewRow = gs:val(row, Opts, missing),
+    OldRow = gstk_db:opt(DB, Gstkid, row),
+    config_line(DB, Pgstkid, Gstkid, OldRow, Opts),
+    if
+	NewRow =:= OldRow; NewRow =:= missing -> ok;
+	true ->
+	    Ngstkid = gstk_db:lookup_gstkid(DB, Gstkid#gstkid.id),
+	    case move_line(NewRow, OldRow, DB, Pgstkid#gstkid.widget_data, Ngstkid) of
+		true ->
+		    gstk_db:insert_opt(DB, Ngstkid, {row, NewRow}),
 		    ok;
-		{error,_Reason} -> ok
+		{error, _Reason} -> ok
 	    end
-    end,
-    ok.
+    end.
 
 %%----------------------------------------------------------------------
 %% Returns: true|false depending on if operation succeeded
 %%----------------------------------------------------------------------
-move_line(NewRow,OldRow,_DB,State,_Ngstkid) ->
-    case ets:lookup(State#state.cell_pos,{1,NewRow}) of
-	[] ->
-	    {error,{gridline,row_outside_grid,NewRow}};
-	[{_,#item{line_id=Lid}}] when Lid =/= free->
-	    {error,{gridline,new_row_occupied,NewRow}};
-	[{_,_NewItem}] ->
-	    #state{tkcanvas=TkW,ncols=Ncols,cell_pos=CP} = State,
-	    swap_lines(TkW,OldRow,NewRow,1,Ncols,CP),
+move_line(NewRow, OldRow, _DB, #state{cell_pos = CP} = State, _Ngstkid) ->
+    case ets:lookup(CP, {1, NewRow}) of
+	[] -> {error, {gridline, row_outside_grid, NewRow}};
+	[{_, #item{line_id = Lid}}] when Lid =/= free -> {error, {gridline, new_row_occupied, NewRow}};
+	[{_, _NewItem}] ->
+	    #state{tkcanvas = TkW, ncols = Ncols} = State,
+	    swap_lines(TkW, OldRow, NewRow, 1, Ncols, CP),
 	    true
     end.
 
 %%----------------------------------------------------------------------
 %% Purpose: swaps an empty newrow with a (oldrow) gridline
 %%----------------------------------------------------------------------
-swap_lines(TkW,OldRow,NewRow,Col,MaxCol,CellPos) when Col =< MaxCol ->
-    [{_,NewItem}] = ets:lookup(CellPos,{Col,NewRow}),
-    [{_,OldItem}] = ets:lookup(CellPos,{Col,OldRow}),
-    swap_cells(TkW,NewItem,OldItem),
-    ets:insert(CellPos,{{Col,NewRow},OldItem}),
-    ets:insert(CellPos,{{Col,OldRow},NewItem}),
-    swap_lines(TkW,OldRow,NewRow,Col+1,MaxCol,CellPos);
-swap_lines(_,_,_,_,_,_) -> done.
+swap_lines(TkW, OldRow, NewRow, Col, MaxCol, CellPos) when Col =< MaxCol ->
+    CN = {Col, NewRow},
+    CO = {Col, OldRow},
+    [{_, NewItem}] = ets:lookup(CellPos, CN),
+    [{_, OldItem}] = ets:lookup(CellPos, CO),
+    swap_cells(TkW, NewItem, OldItem),
+    ets:insert(CellPos, {CN, OldItem}),
+    ets:insert(CellPos, {CO, NewItem}),
+    swap_lines(TkW, OldRow, NewRow, Col + 1, MaxCol, CellPos);
+swap_lines(_, _, _, _, _, _) -> done.
 
-swap_cells(TkW,#item{rect_id=NewRectId,text_id=NewTextId},
-	   #item{rect_id=OldRectId,text_id=OldTextId}) ->
+swap_cells(TkW, #item{rect_id = NewRectId, text_id = NewTextId}, #item{rect_id = OldRectId, text_id = OldTextId}) ->
     Aorid = gstk:to_ascii(OldRectId),
     Aotid = gstk:to_ascii(OldTextId),
     Anrid = gstk:to_ascii(NewRectId),
     Antid = gstk:to_ascii(NewTextId),
-    Pre = [TkW," coords "],
-    OldRectCoords = tcl2erl:ret_str([Pre,Aorid]),
-    OldTextCoords = tcl2erl:ret_str([Pre,Aotid]),
-    NewRectCoords = tcl2erl:ret_str([Pre,Anrid]),
-    NewTextCoords = tcl2erl:ret_str([Pre,Antid]),
-    gstk:exec([Pre,Aotid," ",NewTextCoords]),
-    gstk:exec([Pre,Antid," ",OldTextCoords]),
-    gstk:exec([Pre,Aorid," ",NewRectCoords]),
-    gstk:exec([Pre,Anrid," ",OldRectCoords]).
+    Pre = [TkW, " coords "],
+    gstk:exec([Pre, Aotid, " ", tcl2erl:ret_str([Pre, Antid])]),
+    gstk:exec([Pre, Antid, " ", tcl2erl:ret_str([Pre, Aotid])]),
+    gstk:exec([Pre, Aorid, " ", tcl2erl:ret_str([Pre, Anrid])]),
+    gstk:exec([Pre, Anrid, " ", tcl2erl:ret_str([Pre, Aorid])]).
 
 %%----------------------------------------------------------------------
-%% Pre: {row,Row} option is taken care of.
+%% Pre: {row, Row} option is taken care of.
 %%----------------------------------------------------------------------
-config_line(DB,Pgstkid,Lgstkid,Row,Opts) ->
-    #gstkid{widget_data=State, widget=TkW} = Pgstkid,
-    #state{cell_pos=CP,ncols=Ncols} = State,
-    Ropts = transform_opts(Opts,Ncols),
-    RestOpts = config_gridline(DB,CP,Lgstkid,Ncols,Row,Ropts),
-    gstk_generic:mk_cmd_and_exec(RestOpts,Lgstkid,TkW,"","",DB).
+config_line(DB, #gstkid{widget_data = #state{cell_pos = CP, ncols = Ncols}, widget = TkW}, Lgstkid, Row, Opts) ->
+    gstk_generic:mk_cmd_and_exec(config_gridline(DB, CP, Lgstkid, Ncols, Row, transform_opts(Opts, Ncols)),
+				 Lgstkid, TkW, "", "", DB).
 
 %%----------------------------------------------------------------------
 %% Returns: non-processed options
 %%----------------------------------------------------------------------
-config_gridline(_DB,_CP,_Gstkid,0,_Row,Opts) ->
-    Opts;
-config_gridline(DB,CP,Gstkid,Col,Row,Opts) ->
-    {ColOpts,OtherOpts} = opts_for_col(Col,Opts,[],[]),
-    if
-	ColOpts==[] -> done;
-	true ->
-	    [{_pos,Item}] =  ets:lookup(CP,{Col,Row}),
-	    TkW = Gstkid#gstkid.widget,
-	    TextPre = [TkW," itemconf ",gstk:to_ascii(Item#item.text_id)],
-	    RectPre = [$;,TkW," itemconf ",gstk:to_ascii(Item#item.rect_id)],
-	    case gstk_generic:make_command(ColOpts,Gstkid,TkW,
-					  TextPre,RectPre,DB) of
-		[] -> ok;
-		{error,_Reason} -> ok;
-		Cmd -> gstk:exec(Cmd)
-	    end
-    end,
-    config_gridline(DB,CP,Gstkid,Col-1,Row,OtherOpts).
+config_gridline(_DB, _CP, _Gstkid, 0, _Row, Opts) -> Opts;
+config_gridline(DB, CP, Gstkid, Col, Row, Opts) ->
+    config_gridline(DB, CP, Gstkid, Col - 1, Row,
+		    case opts_for_col(Col, Opts, [], []) of
+			{[], OtherOpts} -> OtherOpts;
+			{ColOpts, OtherOpts} ->
+			    [{_pos, Item}] = ets:lookup(CP, {Col, Row}),
+			    TkW = Gstkid#gstkid.widget,
+			    case gstk_generic:make_command(ColOpts, Gstkid, TkW,
+							   [TkW, " itemconf ", gstk:to_ascii(Item#item.text_id)],
+							   [$;, TkW, " itemconf ", gstk:to_ascii(Item#item.rect_id)],
+							   DB) of
+				{error, _Reason} -> ok;
+				Cmd -> Cmd =:= [] orelse gstk:exec(Cmd)
+			    end,
+			    OtherOpts
+		    end).
 
-opts_for_col(Col,[{{Key,Col},Val}|Opts],ColOpts,RestOpts) ->
-    opts_for_col(Col,Opts,[{{Key,Col},Val}|ColOpts],RestOpts);
-opts_for_col(Col,[Opt|Opts],ColOpts,RestOpts) ->
-    opts_for_col(Col,Opts,ColOpts,[Opt|RestOpts]);
-opts_for_col(_Col,[],ColOpts,RestOpts) -> {ColOpts,RestOpts}.
+opts_for_col(Col, [{{_Key, _Col}, _Val} = V|Opts], ColOpts, RestOpts) -> opts_for_col(Col, Opts, [V|ColOpts], RestOpts);
+opts_for_col(Col, [Opt|Opts], ColOpts, RestOpts) -> opts_for_col(Col, Opts, ColOpts, [Opt|RestOpts]);
+opts_for_col(_Col, [], ColOpts, RestOpts) -> {ColOpts, RestOpts}.
 
 %%----------------------------------------------------------------------
-%% {Key,{Col,Val}} becomes {{Key,Col},Val}
-%% {Key,Val} becomes {{Key,1},Val}...{{Key,Ncol},Val}
+%% {Key, {Col, Val}} becomes {{Key, Col}, Val}
+%% {Key, Val} becomes {{Key, 1}, Val}...{{Key, Ncol}, Val}
 %%----------------------------------------------------------------------
 transform_opts([], _Ncols) -> [];
-transform_opts([{{Key,Col},Val} | Opts],Ncols) ->
-    [{{Key,Col},Val}|transform_opts(Opts,Ncols)];
-transform_opts([{Key,{Col,Val}}|Opts],Ncols) when is_integer(Col) ->
-    [{{Key,Col},Val}|transform_opts(Opts,Ncols)];
-transform_opts([{Key,Val}|Opts],Ncols) ->
-    case lists:member(Key,[fg,bg,text,font]) of
-	true -> 
-	    lists:append(expand_to_all_cols(Key,Val,Ncols),
-			 transform_opts(Opts,Ncols));
-	false ->
-	    case lists:member(Key,[click,doubleclick,row]) of
-		true ->
-		    [{keep_opt,{Key,Val}}|transform_opts(Opts,Ncols)];
-		false ->
-		    [{Key,Val}|transform_opts(Opts,Ncols)]
-	    end
-    end;
-transform_opts([Opt|Opts],Ncols) ->
-    [Opt|transform_opts(Opts,Ncols)].
+transform_opts([{{_Key, _Col}, _Val} = V|Opts], Ncols) -> [V|transform_opts(Opts, Ncols)];
+transform_opts([{Key, {Col, Val}}|Opts], Ncols) when is_integer(Col) -> [{{Key, Col}, Val}|transform_opts(Opts, Ncols)];
+transform_opts([{Key, Val}|Opts], Ncols) when Key =:= fg; Key =:= bg; Key =:= text; Key =:= font ->
+    lists:append(expand_to_all_cols(Key, Val, Ncols), transform_opts(Opts, Ncols));
+transform_opts([{Key, Val}|Opts], Ncols) when Key =:= click; Key =:= doubleclick; Key =:= row ->
+    [{keep_opt, {Key, Val}}|transform_opts(Opts, Ncols)];
+transform_opts([Opt|Opts], Ncols) -> [Opt|transform_opts(Opts, Ncols)].
 
-expand_to_all_cols(Key,Val,1) ->
-    [{{Key,1},Val}];
-expand_to_all_cols(Key,Val,Col) ->
-    [{{Key,Col},Val}|expand_to_all_cols(Key,Val,Col-1)].
-		     
+expand_to_all_cols(Key, Val, 1) -> [{{Key, 1}, Val}];
+expand_to_all_cols(Key, Val, Col) -> [{{Key, Col}, Val}|expand_to_all_cols(Key, Val, Col - 1)].
 
-read(DB, Gstkid, Opt) ->
-    Pgstkid = gstk_db:lookup_gstkid(DB,Gstkid#gstkid.parent),
-    gstk_generic:read_option(DB, Gstkid, Opt,Pgstkid).
+read(DB, #gstkid{parent = Parent} = Gstkid, Opt) ->
+    gstk_generic:read_option(DB, Gstkid, Opt, gstk_db:lookup_gstkid(DB, Parent)).
 
-read_option({font,Column},Gstkid, _TkW,DB,Pgstkid) -> 
-    case gstk_db:opt_or_not(DB,Gstkid,{font,Column}) of
-	false -> gstk_db:opt(DB,Pgstkid,font);
-	{value,V} -> V
+read_option({font, _Column} = Option, Gstkid, _TkW, DB, Pgstkid) -> 
+    case gstk_db:opt_or_not(DB, Gstkid, Option) of
+	false -> gstk_db:opt(DB, Pgstkid, font);
+	{value, V} -> V
     end;
-read_option({Opt,Column},Gstkid, TkW,DB,#gstkid{widget_data=State}) -> 
-    Row = gstk_db:opt(DB,Gstkid,row),
-    [{_pos,Item}] = ets:lookup(State#state.cell_pos,{Column,Row}),
-    Rid = gstk:to_ascii(Item#item.rect_id),
-    Tid = gstk:to_ascii(Item#item.text_id),
-    Pre = [TkW," itemcg "],
-    case Opt of
-	bg -> tcl2erl:ret_color([Pre,Rid," -f"]);
-	fg -> tcl2erl:ret_color([Pre,Tid," -fi"]);
-	text -> tcl2erl:ret_str([Pre,Tid," -te"]);
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, {Opt,Column}}}
+read_option({Opt, Column}, Gstkid, TkW, DB, #gstkid{widget_data = #state{cell_pos = CP}}) -> 
+    [{_pos, #item{rect_id = RId, text_id = TId}}] = ets:lookup(CP, {Column, gstk_db:opt(DB, Gstkid, row)}),
+    Pre = [TkW, " itemcg "],
+    if
+	Opt =:= bg -> ret_color(Pre, RId, " -f");
+	Opt =:= fg -> ret_color(Pre, TId, " -fi");
+	Opt =:= text -> tcl2erl:ret_str([Pre, gstk:to_ascii(TId), " -te"]);
+	true -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, {Opt, Column}}}
     end;
-read_option(Option,Gstkid,TkW,DB,Pgstkid) -> 
-    case lists:member(Option,[bg,fg,text]) of
-	      true -> read_option({Option,1},Gstkid,TkW,DB,Pgstkid);
-	      false -> gstk_db:opt(DB,Gstkid,Option,undefined)
-    end.
+read_option(Option, Gstkid, TkW, DB, Pgstkid) when Option =:= bg; Option =:= fg; Option =:= text ->
+    read_option({Option, 1}, Gstkid, TkW, DB, Pgstkid);
+read_option(Option, Gstkid, _TkW, DB, _Pgstkid) -> gstk_db:opt(DB, Gstkid, Option, undefined).
 
-update_cp_db(0,_Row,_,_) -> ok;
-update_cp_db(Col,Row,ID,CP) ->
-    [{_,Item}] = ets:lookup(CP,{Col,Row}),
-    ets:insert(CP,{{Col,Row},Item#item{line_id = ID}}),
-    update_cp_db(Col-1,Row,ID,CP).
+ret_color(Pre, Id, Str) -> tcl2erl:ret_color([Pre, gstk:to_ascii(Id), Str]).
 
+update_cp_db(0, _Row, _, _) -> ok;
+update_cp_db(Col, Row, ID, CP) ->
+    CR = {Col, Row},
+    [{_, Item}] = ets:lookup(CP, CR),
+    ets:insert(CP, {CR, Item#item{line_id = ID}}),
+    update_cp_db(Col - 1, Row, ID, CP).
 
-event(DB, GridGstkid, Etype, _Edata, [CanItem]) ->
-    State = GridGstkid#gstkid.widget_data,
-    #state{cell_pos=CP,cell_id=CIs,tkcanvas=TkW} = State,
-    case ets:lookup(CIs,CanItem) of 
-	[{_id,{Col,Row}}] ->
-	    [{_pos,Item}] =  ets:lookup(CP,{Col,Row}),
-	    case Item#item.line_id of
-		free -> ok;
-		Id   ->
-		    Lgstkid = gstk_db:lookup_gstkid(DB,Id),
-		    case gstk_db:opt_or_not(DB,Lgstkid,Etype) of
-			{value,true}  ->
-			    Txt = read_option({text,Col},Lgstkid,TkW,
-					      DB,GridGstkid),
-			    gstk_generic:event(DB,Lgstkid,Etype,dummy,
-					      [Col,Row,Txt]);
+event(DB, #gstkid{widget_data = #state{cell_pos = CP, cell_id = CIs, tkcanvas = TkW}} = GridGstkid,
+      Etype, _Edata, [CanItem]) ->
+    case ets:lookup(CIs, CanItem) of
+	[{_id, {Col, Row} = CR}] ->
+	    case ets:lookup(CP, CR) of
+		[{_pos, #item{line_id = free}}] -> ok;
+		[{_pos, #item{line_id = Id}}] ->
+		    Lgstkid = gstk_db:lookup_gstkid(DB, Id),
+		    case gstk_db:opt_or_not(DB, Lgstkid, Etype) of
+			{value, true}  -> gstk_generic:event(DB, Lgstkid, Etype, dummy,
+							     [Col, Row, read_option({text, Col},
+							      Lgstkid, TkW, DB, GridGstkid)]);
 			_ -> ok
 		    end
 	    end;
 	_ -> ok
     end;
-event(_DB, _Gstkid, _Etype, _Edata, _Args) ->
-    ok.
+event(_DB, _Gstkid, _Etype, _Edata, _Args) -> ok.
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_gs.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_gs.erl
--- otp_src_19.0.5/lib/gs/src/gstk_gs.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_gs.erl	2016-08-25 16:37:44.564693354 +0300
@@ -35,20 +35,16 @@
 %% The GS object implementation
 %%----------------------------------------------------------------------
 
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
-    gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+    gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
 
 config(DB, Gstkid, Opts) ->
-    Cmd=gstk_generic:make_command(Opts,Gstkid,"",DB),
-    gstk:exec(Cmd),
+    gstk:exec(gstk_generic:make_command(Opts, Gstkid, "", DB)),
     ok.
 
-read(DB, Gstkid, Opt) ->
-    gstk_generic:read_option(DB, Gstkid, Opt).
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
 
 % No options of my own
-read_option(Option,Gstkid, _TkW,_DB,_) -> 
-    {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}.
+read_option(Option, #gstkid{objtype = ObjType}, _TkW, _DB, _) -> {bad_result, {ObjType, invalid_option, Option}}.
 
-option(_Option, _Gstkid, _TkW, _DB,_) ->
-    invalid_option.
+option(_Option, _Gstkid, _TkW, _DB, _) -> invalid_option.
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk.hrl otp_src_19.0.5-lib-gs/lib/gs/src/gstk.hrl
--- otp_src_19.0.5/lib/gs/src/gstk.hrl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk.hrl	2016-08-25 16:37:44.564693354 +0300
@@ -21,9 +21,6 @@
 %%
 
 %% *NOTE*: if you change here, change ets:match in gstk_db too!
--record(gstkid, {id=undefined, widget, widget_data, owner, parent,
-                objtype}).
+-record(gstkid, {id = undefined, widget, widget_data, owner, parent, objtype}).
 
 -record(so, {main, object, hscroll, vscroll, misc}).
-
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_image.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_image.erl
--- otp_src_19.0.5/lib/gs/src/gstk_image.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_image.erl	2016-08-25 16:37:44.564693354 +0300
@@ -24,7 +24,8 @@
 %% ------------------------------------------------------------
 
 -module(gstk_image).
--compile([{nowarn_deprecated_function,{gs,pair,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, pair, 2}}]).
 
 %%-----------------------------------------------------------------------------
 %% 			    BITMAP OPTIONS
@@ -33,12 +34,12 @@
 %%	anchor			n|w|e|s|nw|sw|ne|se|center
 %%	bg			Color
 %%	bitmap			String
-%%	coords			[{X,Y}]
+%%	coords			[{X, Y}]
 %%	data			Data
 %%	fg			Color
 %%
 %% Attributes for gifs only:
-%%      pix_val                 {{X,Y},Color}|{{{X1,Y1},{X2,Y2}},Color]
+%%      pix_val                 {{X, Y}, Color}|{{{X1, Y1}, {X2, Y2}}, Color]
 %%      save                    String
 %%      refresh
 %%
@@ -59,7 +60,7 @@
 %%	motion			[Bool | {Bool, Data}]
 %%
 %%  Read Options:
-%%      pix_val                 {X,Y}
+%%      pix_val                 {X, Y}
 %%	children
 %%	id
 %%	parent
@@ -68,8 +69,7 @@
 %%  Not Implemented:
 %%
 
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
-	 option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -91,69 +91,55 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, Gstkid, Opts) ->
     case pickout_type(Opts) of
-	bitmap ->
-	    create(bitmap,DB, Gstkid, Opts);
-	_gif ->  %%Default gif
-	    create(gif,DB, Gstkid, Opts)
+	bitmap -> create(bitmap, DB, Gstkid, Opts);
+	_gif -> create(gif, DB, Gstkid, Opts) %%Default gif
     end.
 
-create(gif,DB, Gstkid, Opts) ->
+create(gif, DB, Gstkid, Opts) ->
     case pickout_coords(Opts, []) of
-	{error, Error} ->
-	    {bad_result, Error};
-	{Coords, NewOpts} ->
-	    CCmd = "image create photo",
-	    case tcl2erl:ret_atom(CCmd) of
-		Photo_item when is_atom(Photo_item) ->
-		    #gstkid{parent=Parent,owner=Owner,id=Id}=Gstkid,
-		    Pgstkid = gstk_db:lookup_gstkid(DB, Parent, Owner),
-		    SO = Pgstkid#gstkid.widget_data,
-		    CanvasTkW = SO#so.object,
-		    Photo_item_s = atom_to_list(Photo_item),
-		    gstk_db:insert_opt(DB,Id,gs:pair(coords,Opts)),
-		    Ngstkid=Gstkid#gstkid{widget=CanvasTkW,
-				       widget_data={Photo_item_s,unknown}},
-		    gstk_db:update_widget(DB,Ngstkid),
-		    MCmd = [CanvasTkW," create image ",Coords," -image ", 
-			   Photo_item_s," -anchor nw"],
-		    case gstk_canvas:make_command(NewOpts, Ngstkid,
-						 CanvasTkW, MCmd, DB) of
-			{error,Reason} -> {error,Reason};
-			Cmd when is_list(Cmd) ->
-			    case tcl2erl:ret_int(Cmd) of
-				Item when is_integer(Item) ->
-				    %% buu, not nice
-				    G2 = gstk_db:lookup_gstkid(DB,Id),
-				    NewWidget = {Photo_item_s,Item},
-				    NewGstkid = G2#gstkid{widget_data=NewWidget},
-				    gstk_db:insert_widget(DB, NewGstkid),
-				    NewGstkid;
-				Bad_result ->
-				    {error,Bad_result}
-			    end
-		    end;
-		Bad_result ->
-		    {error,Bad_result}
-	    end
+	{error, Error} -> {bad_result, Error};
+	{Coords, NewOpts} -> case tcl2erl:ret_atom("image create photo") of
+				 Photo_item when is_atom(Photo_item) ->
+				     #gstkid{parent = Parent, owner = Owner, id = Id} = Gstkid,
+				     Pgstkid = gstk_db:lookup_gstkid(DB, Parent, Owner),
+				     #so{object = CanvasTkW} = Pgstkid#gstkid.widget_data,
+				     Photo_item_s = atom_to_list(Photo_item),
+				     gstk_db:insert_opt(DB, Id, gs:pair(coords, Opts)),
+				     Ngstkid = Gstkid#gstkid{widget = CanvasTkW, widget_data = {Photo_item_s, unknown}},
+				     gstk_db:update_widget(DB, Ngstkid),
+				     case gstk_canvas:make_command(NewOpts, Ngstkid, CanvasTkW,
+								   [CanvasTkW, " create image ", Coords, " -image ",
+								    Photo_item_s, " -anchor nw"],
+								   DB) of
+					 {error, _Reason} = E -> E;
+					 Cmd when is_list(Cmd) -> case tcl2erl:ret_int(Cmd) of
+								      Item when is_integer(Item) ->
+									  %% buu, not nice
+									  G2 = gstk_db:lookup_gstkid(DB, Id),
+									  NewGstkid =
+									      G2#gstkid{widget_data =
+											    {Photo_item_s, Item}},
+									  gstk_db:insert_widget(DB, NewGstkid),
+									  NewGstkid;
+								      Bad_result -> {error, Bad_result}
+								  end
+				     end;
+				 Bad_result -> {error, Bad_result}
+			     end
     end;
 
-create(bitmap,DB, Gstkid, Opts) ->
+create(bitmap, DB, Gstkid, Opts) ->
     case pickout_coords(Opts, []) of
-	{error, Error} ->
-	    {bad_result, Error};
+	{error, Error} -> {bad_result, Error};
 	{Coords, NewOpts} ->
-	    #gstkid{parent=Parent,owner=Owner,id=Id}=Gstkid,
-	    Pgstkid = gstk_db:lookup_gstkid(DB, Parent, Owner),
-	    SO = Pgstkid#gstkid.widget_data,
-	    CanvasTkW = SO#so.object,
-	    gstk_db:insert_opt(DB,Id,gs:pair(coords,Opts)),
-	    Ngstkid=Gstkid#gstkid{widget=CanvasTkW, widget_data=no_item},
-	    gstk_db:update_widget(DB,Ngstkid),
-	    MCmd = [CanvasTkW," create bi ", Coords],
-	    gstk_canvas:mk_cmd_and_call(NewOpts,Ngstkid, CanvasTkW, MCmd,DB)
+	    #gstkid{parent = Parent, owner = Owner, id = Id} = Gstkid,
+	    #gstkid{widget_data = #so{object = CanvasTkW}} = gstk_db:lookup_gstkid(DB, Parent, Owner),
+	    gstk_db:insert_opt(DB, Id, gs:pair(coords, Opts)),
+	    Ngstkid = Gstkid#gstkid{widget = CanvasTkW, widget_data=no_item},
+	    gstk_db:update_widget(DB, Ngstkid),
+	    gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create bi ", Coords], DB)
     end.
 
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
 %% Purpose    	: Configure a widget of the type defined in this module.
@@ -166,8 +152,7 @@ create(bitmap,DB, Gstkid, Opts) ->
 config(DB, Gstkid, Opts) ->
     {Canvas, Item} = get_widget(Gstkid),
     AItem = gstk:to_ascii(Item),
-    SCmd = [Canvas, " itemconf ", AItem],
-    gstk_canvas:mk_cmd_and_exec(Opts, Gstkid, Canvas, AItem, SCmd, DB).
+    gstk_canvas:mk_cmd_and_exec(Opts, Gstkid, Canvas, AItem, [Canvas, " itemconf ", AItem], DB).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -180,7 +165,7 @@ config(DB, Gstkid, Opts) ->
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 read(DB, Gstkid, Opt) ->
     {_, Item} = get_widget(Gstkid),
-    gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
+    gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -190,9 +175,8 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy | {Parent, Objmod, Args}.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{parent = P, id = ID} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    #gstkid{parent=P,id=ID}=Gstkid,
     {Canvas, Item} = get_widget(Gstkid),
     {P, ID, gstk_image, [Canvas, Item]}.
 
@@ -205,12 +189,9 @@ delete(DB, Gstkid) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
-    gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
 
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%------------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -226,96 +207,82 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, _Canvas, _DB, _AItem) ->
-    case Option of
-	{bitmap,     Bitmap} ->
-	    BF = re:replace(Bitmap, [92,92], "/", [global,{return,list}]),
-	    {s, [" -bi @", BF]};
-	{load_gif,       File} -> 
-	    F2 = re:replace(File, [92,92], "/", [global,{return,list}]),
-	    {Photo_item, _item} = Gstkid#gstkid.widget_data,
-	    {c,[Photo_item, " configure -file ", gstk:to_ascii(F2)]};
-	{pix_val,  {Coords,Color}} ->
-	    {Photo_item, _item} = Gstkid#gstkid.widget_data,
-	    {c, [Photo_item, " put ", gstk:to_color(Color), " -to ", 
-		 coords(Coords)]};
-	{save_gif, Name} ->
-	    {Photo_item, _item} = Gstkid#gstkid.widget_data,
-	    {c, [Photo_item, " write ", gstk:to_ascii(Name)]};
-	{fg,          Color} -> {s, [" -fo ", gstk:to_color(Color)]};
-	{bg,          Color} -> {s, [" -ba ", gstk:to_color(Color)]};
-	{anchor,         How} -> {s, [" -anchor ", gstk:to_ascii(How)]};
-	_ -> invalid_option
-    end.
+option(Option, Gstkid, _Canvas, _DB, _AItem) -> option(Option, Gstkid).
+
+option({load_gif, File}, #gstkid{widget_data = {Photo_item, _item}}) ->
+    option_c([Photo_item, " configure -file ",
+	      gstk:to_ascii(re:replace(File, [92, 92], "/", [global, {return, list}]))]);
+option({pix_val, {Coords, Color}}, #gstkid{widget_data = {Photo_item, _item}}) ->
+    option_c([Photo_item, " put ", gstk:to_color(Color), " -to ", coords(Coords)]);
+option({save_gif, Name}, #gstkid{widget_data = {Photo_item, _item}}) ->
+    option_c([Photo_item, " write ", gstk:to_ascii(Name)]);
+option(Option, _Gstkid) -> option(Option).
+
+option({bitmap, Bitmap}) -> option_s(" -bi @", re:replace(Bitmap, [92, 92], "/", [global, {return, list}]));
+option({fg, Color}) -> to_color(" -fo ", Color);
+option({bg, Color}) -> to_color(" -ba ", Color);
+option({anchor, How}) -> option_s(" -anchor ", gstk:to_ascii(How));
+option(_Option) -> invalid_option.
+
+option_c(L) -> {c, L}.
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
 
+to_color(Str, Color) -> option_s(Str, gstk:to_color(Color)).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option, Gstkid, Canvas, _DB, AItem) ->
-    case Option of
-	anchor   -> tcl2erl:ret_atom([Canvas," itemcget ",AItem," -anchor"]);
-	bg       -> tcl2erl:ret_color([Canvas, " itemcget ", AItem, " -ba"]);
-	bitmap   -> tcl2erl:ret_file([Canvas, " itemcget ", AItem, " -bi"]);
-	fg       -> tcl2erl:ret_color([Canvas, " itemcget ", AItem, " -fo"]);
-	{pix_val,{X,Y}} ->
-	    {Photo_item, _item} = Gstkid#gstkid.widget_data,
-	    ret_photo_color([Photo_item," get ",coords({X,Y})]);
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
-    end.
+read_option(Option, Gstkid, Canvas, _DB, AItem) -> read_option(Option, Gstkid, Canvas, AItem).
 
-ret_photo_color(Cmd) ->
-    case gstk:call(Cmd) of
-	{result,Str} ->
-	    {ok, [R,G,B],[]} = io_lib:fread("~d ~d ~d", Str),
-	    {R,G,B};
+read_option({pix_val, {_, _} = XY}, #gstkid{widget_data = {Photo_item, _item}}, _Canvas, _AItem) ->
+    case gstk:call([Photo_item, " get ", coords(XY)]) of
+	{result, Str} ->
+	    {ok, [R, G, B], []} = io_lib:fread("~d ~d ~d", Str),
+	    {R, G, B};
 	Bad_result -> Bad_result
+    end;
+read_option(Option, Gstkid, Canvas, AItem) ->
+    case read_option(Option, AItem, Canvas) of
+	invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+	O -> O
     end.
 
+read_option(anchor, AItem, Canvas) -> tcl2erl:ret_atom([Canvas, " itemcget ", AItem, " -anchor"]);
+read_option(bitmap, AItem, Canvas) -> tcl2erl:ret_file([Canvas, " itemcget ", AItem, " -bi"]);
+read_option(bg, AItem, Canvas) -> ret_color(" -ba", AItem, Canvas);
+read_option(fg, AItem, Canvas) -> ret_color(" -fo", AItem, Canvas);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
+
+ret_color(Str, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcget ", AItem, Str]).
 
 %%------------------------------------------------------------------------------
 %%			       PRIMITIVES
 %%------------------------------------------------------------------------------
-get_widget(#gstkid{widget=Canvas,widget_data={_Photo_item,Item}}) ->
-    {Canvas,Item};
-get_widget(#gstkid{widget=Canvas,widget_data=Item}) ->
-    {Canvas,Item}.
+get_widget(#gstkid{widget = Canvas, widget_data ={_Photo_item, Item}}) -> {Canvas, Item};
+get_widget(#gstkid{widget = Canvas, widget_data = Item}) -> {Canvas, Item}.
 
-pickout_coords([{coords,Coords} | Rest], Opts) when length(Coords) == 1 ->
+pickout_coords([{coords, [_] = Coords}|Rest], Opts) ->
     case coords(Coords) of
-	invalid ->
-	    {error, "An image must have two coordinates"};
-	RealCoords ->
-	    {RealCoords, lists:append(Rest, Opts)}
+	invalid -> {error, "An image must have two coordinates"};
+	RealCoords -> {RealCoords, lists:append(Rest, Opts)}
     end;
-pickout_coords([Opt | Rest], Opts) ->
-    pickout_coords(Rest, [Opt|Opts]);
-pickout_coords([], _Opts) ->
-    {error, "An image must have two coordinates"}.
-
-coords({X,Y}) when is_number(X),is_number(Y) ->
-    [gstk:to_ascii(X), " ", gstk:to_ascii(Y), " "];
-coords([{X,Y} | R]) when is_number(X),is_number(Y) ->
-    [gstk:to_ascii(X), " ", gstk:to_ascii(Y), " ", coords(R)];
-coords({{X1,Y1},{X2,Y2}}) when is_number(X1),is_number(Y1),is_number(X2),is_number(Y2) ->
-    [gstk:to_ascii(X1), " ", gstk:to_ascii(Y1)," ",
-     gstk:to_ascii(X2), " ", gstk:to_ascii(Y2)];
-coords([_]) -> %% not a pair
-    invalid;
-coords([]) ->
-    [].
+pickout_coords([Opt|Rest], Opts) -> pickout_coords(Rest, [Opt|Opts]);
+pickout_coords([], _Opts) -> {error, "An image must have two coordinates"}.
 
+coords({X, Y}) when is_number(X), is_number(Y) -> [gstk:to_ascii(X), " ", gstk:to_ascii(Y), " "];
+coords([{X, Y}|R]) when is_number(X), is_number(Y) -> [gstk:to_ascii(X), " ", gstk:to_ascii(Y), " ", coords(R)];
+coords({{X1, Y1}, {X2, Y2}}) when is_number(X1), is_number(Y1), is_number(X2), is_number(Y2) ->
+    [gstk:to_ascii(X1), " ", gstk:to_ascii(Y1), " ", gstk:to_ascii(X2), " ", gstk:to_ascii(Y2)];
+coords([_]) -> invalid; %% not a pair
+coords([]) -> [].
 
-pickout_type([{bitmap,_Str}|_Options]) ->
-    bitmap;
-pickout_type([{gif,_Str}|_Options])  ->
-    gif;
-pickout_type([]) ->
-    none;
-pickout_type([_|Tail]) ->
-    pickout_type(Tail).
+pickout_type([{Pic, _Str}|_Options]) when Pic =:= bitmap; Pic =:= gif -> bitmap;
+pickout_type([]) -> none;
+pickout_type([_|Tail]) -> pickout_type(Tail).
 
 %% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_label.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_label.erl
--- otp_src_19.0.5/lib/gs/src/gstk_label.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_label.erl	2016-08-25 16:37:44.564693354 +0300
@@ -28,8 +28,8 @@
 %% 			    LABEL OPTIONS
 %%
 %%  Attributes:
-%%	align			n,w,s,e,nw,se,ne,sw,center
-%%	anchor			n,w,s,e,nw,se,ne,sw,center
+%%	align			n, w,s, e,nw, se, ne, sw, center
+%%	anchor			n, w,s, e,nw, se, ne, sw, center
 %%	bg			Color
 %%	bw			Int
 %%	data			Data
@@ -76,7 +76,7 @@
 %%	focus			?????? (-takefocus)
 %%
 
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -88,13 +88,12 @@
 %% Purpose    	: Create a widget of the type defined in this module.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, GstkId, Opts) ->
-    TkW = gstk_generic:mk_tkw_child(DB,GstkId),
-    PlacePreCmd = [";place ", TkW],
-    Ngstkid = GstkId#gstkid{widget=TkW},
-    case gstk_generic:make_command(Opts,Ngstkid,TkW,"",PlacePreCmd,DB) of
-	{error,Reason} -> {error,Reason};
+    TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+    Ngstkid = GstkId#gstkid{widget = TkW},
+    case gstk_generic:make_command(Opts, Ngstkid, TkW, "", [";place ", TkW], DB) of
+	{error, _Reason} = E -> E;
 	Cmd when is_list(Cmd) ->
-	    gstk:exec(["label ", TkW,Cmd]),
+	    gstk:exec(["label ", TkW, Cmd]),
 	    Ngstkid
     end.
 
@@ -107,11 +106,8 @@ create(DB, GstkId, Opts) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    TkW = Gstkid#gstkid.widget,
-    SimplePreCmd = [TkW, " conf"],
-    PlacePreCmd = [";place ", TkW],
-    gstk_generic:mk_cmd_and_exec(Opts,Gstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+    gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -122,8 +118,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    gstk_generic:read_option(DB, Gstkid, Opt).
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -134,13 +129,11 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    Gstkid#gstkid.widget.
-
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+    TkW.
 
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%-----------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -155,12 +148,13 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, _Gstkid, _TkW, _DB,_) ->
-    case Option of
-	{underline,     Int} -> {s, [" -und ", gstk:to_ascii(Int)]};
-	{wraplength,    Int} -> {s, [" -wra ", gstk:to_ascii(Int)]};
-	_                    -> invalid_option
-    end.
+option(Option, _Gstkid, _TkW, _DB, _) -> option(Option).
+
+option({underline, Int}) -> to_ascii(" -und ", Int);
+option({wraplength, Int}) -> to_ascii(" -wra ", Int);
+option(_Option) -> invalid_option.
+
+to_ascii(Str, Int) -> {s, [Str, gstk:to_ascii(Int)]}.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/4
@@ -172,12 +166,16 @@ option(Option, _Gstkid, _TkW, _DB,_) ->
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid,TkW,_DB,_) -> 
-    case Option of
-	underline     -> tcl2erl:ret_int([TkW," cg -und"]);
-	wraplength    -> tcl2erl:ret_int([TkW," cg -wra"]);
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(Option, Gstkid, TkW, _DB, _) ->
+    case read_option(Option, TkW) of
+	invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+	O -> O
     end.
 
-%%% ----- Done -----
+read_option(underline, TkW) -> ret_int(" cg -und", TkW);
+read_option(wraplength, TkW) -> ret_int(" cg -wra", TkW);
+read_option(_Option, _TkW) -> invalid_option.
+
+ret_int(Str, TkW) -> tcl2erl:ret_int([TkW, Str]).
 
+%%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_line.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_line.erl
--- otp_src_19.0.5/lib/gs/src/gstk_line.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_line.erl	2016-08-25 16:37:44.565693335 +0300
@@ -25,14 +25,13 @@
 
 -module(gstk_line).
 
-
 %%-----------------------------------------------------------------------------
 %% 			    LINE OPTIONS
 %%
 %%  Attributes:
 %%	arrow			none | first | last | both
 %%	capstyle		butt | projecting | round
-%%	coords			[{X1,Y1}, {X2,Y2} | {Xn,Yn}]
+%%	coords			[{X1, Y1}, {X2, Y2} | {Xn, Yn}]
 %%	data			Data
 %%	fg			Color
 %%	joinstyle		miter | bevel | round
@@ -66,8 +65,7 @@
 %%  Not Implemented:
 %%
 
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
-	 option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -80,23 +78,18 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, Gstkid, Opts) ->
     case pickout_coords(Opts, []) of
-	{error, Error} ->
-	    {bad_result, Error};
+	{error, Error} -> {bad_result, Error};
 	{Coords, NewOpts} ->
-	    Ngstkid=gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
-	    #gstkid{widget=CanvasTkW}=Ngstkid,
-	    MCmd = [CanvasTkW, " create li ", Coords],
-	    gstk_canvas:mk_cmd_and_call(NewOpts,Ngstkid, CanvasTkW, MCmd, DB)
+	    #gstkid{widget = CanvasTkW} = Ngstkid = gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
+	    gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create li ", Coords], DB)
     end.
 
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
 %% Purpose    	: Configure a widget of the type defined in this module.
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    gstk_canvas:item_config(DB, Gstkid, Opts).
+config(DB, Gstkid, Opts) -> gstk_canvas:item_config(DB, Gstkid, Opts).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -107,9 +100,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    Item = Gstkid#gstkid.widget_data,
-    gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
+read(DB, #gstkid{widget_data = Item} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -119,8 +110,7 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy | {Parent, Objmod, Args}.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
-    gstk_canvas:item_delete_impl(DB,Gstkid).
+delete(DB, Gstkid) -> gstk_canvas:item_delete_impl(DB, Gstkid).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: destroy/3
@@ -131,12 +121,9 @@ delete(DB, Gstkid) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
-    gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
 
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%-----------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -152,19 +139,22 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, _Gstkid, _Canvas, _DB, _AItem) ->
-    case Option of
-	{arrow,       Where} -> {s, [" -arrow ", gstk:to_ascii(Where)]};
-	{capstyle,    Style} -> {s, [" -ca ", gstk:to_ascii(Style)]};
-	{fg,          Color} -> {s, [" -f ", gstk:to_color(Color)]};
-	{joinstyle,   Style} -> {s, [" -jo ", gstk:to_ascii(Style)]};
-	{smooth,       Bool} -> {s, [" -sm ", gstk:to_ascii(Bool)]};
-	{splinesteps,   Int} -> {s, [" -sp ", gstk:to_ascii(Int)]};
-	{width,         Int} -> {s, [" -w ", gstk:to_ascii(Int)]};
+option(Option, _Gstkid, _Canvas, _DB, _AItem) -> option(Option).
 
-	_ -> invalid_option
-    end.
+option({fg, Color}) -> option_s(" -f ", gstk:to_color(Color));
+option({arrow, Where}) -> to_ascii(" -arrow ", Where);
+option({capstyle, Style}) -> to_ascii(" -ca ", Style);
+option({joinstyle, Style}) -> to_ascii(" -jo ", Style);
+option({smooth, Bool}) -> to_ascii(" -sm ", Bool);
+option({splinesteps, Int}) -> to_ascii(" -sp ", Int);
+option({width, Int}) -> to_ascii(" -w ", Int);
+option(_Option) -> invalid_option.
+
+option_s(L) -> {s, L}.
 
+option_s(Str, Val) -> option_s([Str, Val]).
+
+to_ascii(Str, Val) -> option_s(Str, gstk:to_ascii(Val)).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
@@ -174,30 +164,31 @@ option(Option, _Gstkid, _Canvas, _DB, _A
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 read_option(Option, Gstkid, Canvas, _DB, AItem) ->
-    case Option of
-	arrow       -> tcl2erl:ret_atom([Canvas, " itemcg ",AItem, " -arrow"]);
-	capstyle    -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, " -ca"]);
-	fg          -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -f"]);
-	joinstyle   -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, " -jo"]);
-	smooth      -> tcl2erl:ret_bool([Canvas, " itemcg ", AItem, " -sm"]);
-	splinesteps -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -sp"]);
-	stipple     ->
-	    tcl2erl:ret_stipple([Canvas," itemcg ",AItem," -stipple"]);
-	width       -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+    case read_option(Option, AItem, Canvas) of
+	invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+	O -> O
     end.
 
-pickout_coords([{coords,Coords} | Rest], Opts) when length(Coords) >= 2 ->
+read_option(arrow, AItem, Canvas) -> ret_atom(" -arrow", AItem, Canvas);
+read_option(capstyle, AItem, Canvas) -> ret_atom(" -ca", AItem, Canvas);
+read_option(joinstyle, AItem, Canvas) -> ret_atom(" -jo", AItem, Canvas);
+read_option(fg, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -f"]);
+read_option(smooth, AItem, Canvas) -> tcl2erl:ret_bool([Canvas, " itemcg ", AItem, " -sm"]);
+read_option(splinesteps, AItem, Canvas) -> ret_int(" -sp", AItem, Canvas);
+read_option(width, AItem, Canvas) -> ret_int(" -w", AItem, Canvas);
+read_option(stipple, AItem, Canvas) -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -stipple"]);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
+
+ret_atom(Str, AItem, Canvas) -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, Str]).
+
+ret_int(Str, AItem, Canvas) -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, Str]).
+
+pickout_coords([], _Opts) -> {error, "A line must have at least four coordinates"};
+pickout_coords([{coords, [_,_|_] = Coords}|Rest], Opts) ->
     case gstk_canvas:coords(Coords) of
-        invalid ->
-            {error, "A line must have at least four coordinates"};
-        RealCoords ->
-            {RealCoords, lists:append(Rest, Opts)}
+        invalid -> pickout_coords([], Opts);
+        RealCoords -> {RealCoords, lists:append(Rest, Opts)}
     end;
-pickout_coords([Opt | Rest], Opts) ->
-    pickout_coords(Rest, [Opt|Opts]);
-pickout_coords([], _Opts) ->
-    {error, "A line must have at least four coordinates"}.
+pickout_coords([Opt|Rest], Opts) -> pickout_coords(Rest, [Opt|Opts]).
 
 %% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_listbox.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_listbox.erl
--- otp_src_19.0.5/lib/gs/src/gstk_listbox.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_listbox.erl	2016-08-25 16:37:44.565693335 +0300
@@ -30,7 +30,7 @@
 %%
 %%  Attributes:
 %%	activebg		Color
-%%	anchor			n,w,s,e,nw,se,ne,sw,center
+%%	anchor			n, w,s, e,nw, se, ne, sw, center
 %%	bc			Color
 %%	bg			Color
 %%	bw			Wth
@@ -63,7 +63,7 @@
 %%	del			Index | {FromIdx, ToIdx}
 %%	get			Index
 %%	see			Index
-%%	selection			=> [Idx1,Idx2,Idx3...]
+%%	selection			=> [Idx1, Idx2, Idx3...]
 %%	setfocus		Bool
 %%	size			Int
 %%
@@ -88,8 +88,7 @@
 %%	type
 %%
 
--export([create/3,config/3,read/3,delete/2,event/5,wid_event/5,option/5,
-	read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, wid_event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -101,32 +100,25 @@
 %% Purpose    	: Create a widget of the type defined in this module.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, GstkId, Opts) ->
-    MainW = gstk_generic:mk_tkw_child(DB,GstkId),
-    Listbox = lists:append(MainW,".z"),
-    {Vscroll, Hscroll, NewOpts} = gstk_generic:parse_scrolls(Opts),
-    WidgetD = #so{main=MainW, object=Listbox,
-		  hscroll=Hscroll, vscroll=Vscroll},
-    Gstkid=GstkId#gstkid{widget=MainW, widget_data=WidgetD},
-    MandatoryCmd = ["so_create listbox ", MainW],
-    case gstk:call(MandatoryCmd) of
+    MainW = gstk_generic:mk_tkw_child(DB, GstkId),
+    case gstk:call(["so_create listbox ", MainW]) of
 	{result, _} ->
-	    SimplePreCmd = [MainW, " conf"],
-	    PlacePreCmd = [";place ", MainW],
-	    case gstk_generic:make_command(NewOpts, Gstkid, MainW,SimplePreCmd,
-					  PlacePreCmd, DB,Listbox) of
-		{error,Reason} -> {error,Reason};
+	    Listbox = lists:append(MainW, ".z"),
+	    {Vscroll, Hscroll, NewOpts} = gstk_generic:parse_scrolls(Opts),
+	    Gstkid = GstkId#gstkid{widget = MainW, widget_data = #so{main = MainW, object = Listbox,
+								     hscroll = Hscroll, vscroll = Vscroll}},
+	    case gstk_generic:make_command(NewOpts, Gstkid, MainW, [MainW, " conf"], [";place ", MainW], DB, Listbox) of
+		{error, _Reason} = E -> E;
 		Cmd when is_list(Cmd) ->
 		    gstk:exec(Cmd),
-		    gstk:exec([MainW,".sy conf -rel sunken -bo 2;",
-			      MainW,".pad.sx conf -rel sunken -bo 2;",Listbox,
-			 " conf -bo 2 -relief sunken -highlightth 2 -expo 0;"]),
+		    gstk:exec([MainW, ".sy conf -rel sunken -bo 2;",
+			       MainW, ".pad.sx conf -rel sunken -bo 2;",
+			       Listbox, " conf -bo 2 -relief sunken -highlightth 2 -expo 0;"]),
 		    Gstkid
 	    end;
-	Bad_Result ->
-	    {error, Bad_Result}
+	Bad_Result -> {error, Bad_Result}
     end.
 
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
 %% Purpose    	: Configure a widget of the type defined in this module.
@@ -136,15 +128,9 @@ create(DB, GstkId, Opts) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Options) ->
-    SO = Gstkid#gstkid.widget_data,
-    MainW = Gstkid#gstkid.widget,
-    Listbox = SO#so.object,
-    NewOpts = gstk_generic:parse_scrolls(Gstkid, Options),
-    SimplePreCmd = [MainW, " conf"],
-    PlacePreCmd = [";place ", MainW],
-    gstk_generic:mk_cmd_and_exec(NewOpts, Gstkid, MainW,
-				SimplePreCmd, PlacePreCmd, DB,Listbox).
+config(DB, #gstkid{widget_data = #so{object = Listbox}, widget = MainW} = Gstkid, Options) ->
+    gstk_generic:mk_cmd_and_exec(gstk_generic:parse_scrolls(Gstkid, Options), Gstkid, MainW,
+				 [MainW, " conf"], [";place ", MainW], DB, Listbox).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -155,10 +141,7 @@ config(DB, Gstkid, Options) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    SO = Gstkid#gstkid.widget_data,
-    gstk_generic:read_option(DB, Gstkid, Opt,SO#so.object).
-
+read(DB, #gstkid{widget_data = #so{object = TkW}} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, TkW).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -168,9 +151,9 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    Gstkid#gstkid.widget.
+    TkW.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: event/5
@@ -183,24 +166,17 @@ delete(DB, Gstkid) ->
 %%		
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-event(DB, Gstkid, click, Edata, Args) ->
-    wid_event(DB, Gstkid, click, Edata, Args);
-event(DB, Gstkid, doubleclick, Edata, Args) ->
-    wid_event(DB, Gstkid, doubleclick, Edata, Args);
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
-
+event(DB, Gstkid, Etype, Edata, Args) when Etype =:= click; Etype =:= doubleclick ->
+    wid_event(DB, Gstkid, Etype, Edata, Args);
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %% widget specific events
-wid_event(DB, Gstkid, Etype, Edata, _Args) ->
-    SO = Gstkid#gstkid.widget_data,
-    TkW = SO#so.object,
-    CurIdx = tcl2erl:ret_int([TkW," index active;"]),
-    CurTxt = tcl2erl:ret_str([TkW," get active;"]),
-    CurSel = tcl2erl:ret_list([TkW," curselection;"]),
-    Arg2 = [CurIdx,CurTxt,lists:member(CurIdx,CurSel)],
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Arg2).
-
+wid_event(DB, #gstkid{widget_data = #so{object = TkW}}= Gstkid, Etype, Edata, _Args) ->
+    CurIdx = tcl2erl:ret_int([TkW, " index active;"]),
+    gstk_generic:event(DB, Gstkid, Etype, Edata,
+		       [CurIdx,
+		        tcl2erl:ret_str([TkW, " get active;"]),
+		        lists:member(CurIdx, tcl2erl:ret_list([TkW, " curselection;"]))]).
 
 %%-----------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -216,52 +192,48 @@ wid_event(DB, Gstkid, Etype, Edata, _Arg
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, MainW,DB, Listbox) ->
-    case Option of
-	{items,          Items} when is_list(Items) ->
-	    {c, [Listbox," del 0 end ;", Listbox," ins 0 ",item_list(Items)]};
-	{selection, {From, To}} when is_integer(From),is_integer(To) ->
-	    {c,[Listbox," sel set ",gstk:to_ascii(From)," " ,gstk:to_ascii(To)]};
-	{font,            Font} when is_tuple(Font) ->
-	    gstk_db:insert_opt(DB,Gstkid,Option),
-	    {c, [Listbox," conf -font ",gstk_font:choose_ascii(DB,Font)]};
-	{selection,   clear} ->
-	    {c, [Listbox," sel clear 0 end"]};
-	{selection,     Idx} when is_integer(Idx) ->
-	    {c, [Listbox, " select set ", gstk:to_ascii(Idx)]};
-	{selectmode,   Mode} ->
-	    {c, [Listbox, " conf -selectm ", gstk:to_ascii(Mode)]};
-	{xselection,   Bool} ->
-	    {c, [Listbox, " conf -exportse ", gstk:to_ascii(Bool)]};
-	{fg,          Color} ->
-	    {c, [Listbox, " conf -fg ", gstk:to_color(Color)]};
-	
-	{del,   {From, To}} ->
-	    {c, [Listbox, " del ", integer_to_list(From), " ",
-		 integer_to_list(To)]};
-	{del,          Idx} ->
-	    {c, [Listbox, " del ", integer_to_list(Idx)]};
-	clear               -> {c, [Listbox," del 0 end"]};
-	{add,   {Idx, Str}} ->
-	    {c, [Listbox, " ins ", integer_to_list(Idx), " ",
-		 gstk:to_ascii(Str)]};
-	{add,          Str} ->
-	    {c, [Listbox," ins end ",gstk:to_ascii(Str)]};
-	{change, {Idx, Str}} ->
-	    {c, [Listbox, " del ", integer_to_list(Idx), $;,
-		 Listbox, " ins ", integer_to_list(Idx), " " ,
-		 gstk:to_ascii(Str)]};
-	{see,        Idx} ->   
-	    {c, [Listbox," see ",gstk:to_ascii(Idx)]};
-	
-	{setfocus,    true} -> {c, ["focus ", MainW]};
-	{setfocus,   false} -> {c, ["focus ."]};
-	
-	{click,         On} -> cbind(DB, Gstkid, Listbox, click, On);
-	{doubleclick,   On} -> cbind(DB, Gstkid, Listbox, doubleclick, On);
-	_ -> invalid_option
-    end.
+option({font, Font} = Option, Gstkid, _MainW, DB, Listbox) when is_tuple(Font) ->
+    gstk_db:insert_opt(DB, Gstkid, Option),
+    option_c([Listbox, " conf -font ", gstk_font:choose_ascii(DB, Font)]);
+option({click, On}, Gstkid, _MainW, DB, Listbox) -> cbind(DB, Gstkid, Listbox, click, On);
+option({doubleclick, On}, Gstkid, _MainW, DB, Listbox) -> cbind(DB, Gstkid, Listbox, doubleclick, On);
+option(Option, _Gstkid, MainW, _DB, Listbox) -> option(Option, Listbox, MainW).
 
+option({setfocus, true}, _Listbox, MainW) -> option_c(["focus ", MainW]);
+option(Option, Listbox, _MainW) -> option(Option, Listbox).
+
+option(clear, Listbox) -> option_c(" del 0 end", Listbox);
+option({items, Items}, Listbox) when is_list(Items) ->
+    option_c([Listbox, " del 0 end ;", Listbox, " ins 0 ", item_list(Items)]);
+option({selection, clear}, Listbox) -> option_c(" sel clear 0 end", Listbox);
+option({selection, {From, To}}, Listbox) when is_integer(From), is_integer(To) ->
+    option_c(" sel set ", Listbox, gstk:to_ascii(From), gstk:to_ascii(To));
+option({selection, Idx}, Listbox) when is_integer(Idx) -> to_ascii(" select set ", Listbox, Idx);
+option({selectmode, Mode}, Listbox) -> to_ascii(" conf -selectm ", Listbox, Mode);
+option({xselection, Bool}, Listbox) -> to_ascii(" conf -exportse ", Listbox, Bool);
+option({fg, Color}, Listbox) -> option_c(" conf -fg ", Listbox, gstk:to_color(Color));
+option({see, Idx}, Listbox) -> to_ascii(" see ", Listbox, Idx);
+option({add, {Idx, Str}}, Listbox) -> option_c(" ins ", Listbox, integer_to_list(Idx), gstk:to_ascii(Str));
+option({add, Str}, Listbox) -> to_ascii(" ins end ", Listbox, Str);
+option({del, {From, To}}, Listbox) -> option_c(" del ", Listbox, integer_to_list(From), integer_to_list(To));
+option({del, Idx}, Listbox) -> option_c(" del ", Listbox, integer_to_list(Idx));
+option({change, {Idx, Str}}, Listbox) ->
+    option_c([Listbox, " del ", integer_to_list(Idx), $;, Listbox, " ins ", integer_to_list(Idx), " ",
+	      gstk:to_ascii(Str)]);
+option(Option, _Listbox) -> option(Option).
+
+option({setfocus, false}) -> option_c(["focus ."]);
+option(_Option) -> invalid_option.
+
+option_c(L) -> {c, L}.
+
+option_c(Str, Listbox) -> option_c([Listbox, Str]).
+
+option_c(Str, Listbox, Val) -> option_c([Listbox, Str, Val]).
+
+option_c(Str, Listbox, A, B) -> option_c([Listbox, Str, A, " ", B]).
+
+to_ascii(Str, Listbox, Val) -> option_c(Str, Listbox, gstk:to_ascii(Val)).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/3
@@ -273,52 +245,49 @@ option(Option, Gstkid, MainW,DB, Listbox
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,GstkId,_MainW,DB,Listbox) ->
-    case Option of
-	fg            -> tcl2erl:ret_color([Listbox," cg -fg"]);
-	font          -> gstk_db:opt(DB,GstkId,font,undefined);
-	selection     -> tcl2erl:ret_list([Listbox, " curselection"]);
-	setfocus      -> tcl2erl:ret_focus(Listbox, "focus");
+read_option(Option, GstkId, _MainW, DB, Listbox) -> read_option(Option, GstkId, Listbox, DB).
 
-	items         -> tcl2erl:ret_str_list([Listbox, " get 0 end"]);
-	selectmode    -> tcl2erl:ret_atom([Listbox, " cg -selectmode"]);
-	size          -> tcl2erl:ret_int([Listbox, " size"]);
-	xselection    -> tcl2erl:ret_bool([Listbox, " cg -exportsel"]);
-	{get, Idx}    -> tcl2erl:ret_str([Listbox, " get ",gstk:to_ascii(Idx)]);
-        click         -> gstk_db:is_inserted(DB, GstkId, click);
-        doubleclick   -> gstk_db:is_inserted(DB, GstkId, doubleclick);
-	
-	_ -> {bad_result, {GstkId#gstkid.objtype, invalid_option, Option}}
+read_option(font, GstkId, _Listbox, DB) -> gstk_db:opt(DB, GstkId, font, undefined);
+read_option(click, GstkId, _Listbox, DB) -> gstk_db:is_inserted(DB, GstkId, click);
+read_option(doubleclick, GstkId, _Listbox, DB) -> gstk_db:is_inserted(DB, GstkId, doubleclick);
+read_option(Option, GstkId, Listbox, _DB) -> read_option(Option, GstkId, Listbox).
+
+read_option(Option, GstkId, Listbox) ->
+    case read_option(Option, Listbox) of
+	invalid_option -> {bad_result, {GstkId#gstkid.objtype, invalid_option, Option}};
+	O -> O
     end.
 
+read_option(fg, Listbox) -> tcl2erl:ret_color([Listbox, " cg -fg"]);
+read_option(items, Listbox) -> tcl2erl:ret_str_list([Listbox, " get 0 end"]);
+read_option(setfocus, Listbox) -> tcl2erl:ret_focus(Listbox, "focus");
+read_option(selection, Listbox) -> tcl2erl:ret_list([Listbox, " curselection"]);
+read_option(selectmode, Listbox) -> tcl2erl:ret_atom([Listbox, " cg -selectmode"]);
+read_option(size, Listbox) -> tcl2erl:ret_int([Listbox, " size"]);
+read_option(xselection, Listbox) -> tcl2erl:ret_bool([Listbox, " cg -exportsel"]);
+read_option({get, Idx}, Listbox) -> tcl2erl:ret_str([Listbox, " get ", gstk:to_ascii(Idx)]);
+read_option(_Option, _Listbox) -> invalid_option.
 
 %%-----------------------------------------------------------------------------
 %%			       PRIMITIVES
 %%-----------------------------------------------------------------------------
 
-item_list([H|T]) ->
-    [gstk:to_ascii(H),$ |item_list(T)];
-item_list([]) ->
-    [].
+item_list(L) -> lists:foldr(fun(E, A) -> [gstk:to_ascii(E), $ |A] end, [], L).
 
 cbind(DB, Gstkid, Listbox, Etype, {true, Edata}) ->
-    Button = case Etype of
-                 click       -> " <ButtonRelease-1> ";
-                 doubleclick -> " <Double-ButtonRelease-1> "
-             end,
-    Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
-    {c, ["bind " ,Listbox, Button, "{erlsend ", Eref," }"]};
- 
-cbind(DB, Gstkid, Listbox, Etype, true) ->    
-    cbind(DB, Gstkid, Listbox, Etype, {true, []});
+    {c, ["bind " , Listbox,
+     if
+	 Etype =:= click -> " <ButtonRelease-1> ";
+	 Etype =:= doubleclick -> " <Double-ButtonRelease-1> "
+     end,
+     "{erlsend ", gstk_db:insert_event(DB, Gstkid, Etype, Edata), " }"]};
  
-cbind(DB, Gstkid, Listbox, Etype, _On) ->    
-    Button = case Etype of
-                 click       -> " <Button-1> {}";
-                 doubleclick -> " <Double-Button-1> {}"
-             end,
+cbind(DB, Gstkid, Listbox, Etype, true) -> cbind(DB, Gstkid, Listbox, Etype, {true, []});
+cbind(DB, Gstkid, Listbox, Etype, _On) ->
     gstk_db:delete_event(DB, Gstkid, Etype),
-    {c, ["bind ",Listbox, Button]}.
-
+    {c, ["bind ", Listbox, if
+			       Etype =:= click -> " <Button-1> {}";
+			       Etype =:= doubleclick -> " <Double-Button-1> {}"
+			   end]}.
 
 %%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_menubar.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menubar.erl
--- otp_src_19.0.5/lib/gs/src/gstk_menubar.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menubar.erl	2016-08-25 16:37:44.565693335 +0300
@@ -63,8 +63,7 @@
 %%	align			How
 %%
 
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5,
-	mk_create_opts_for_child/4]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5, mk_create_opts_for_child/4]).
 
 -include("gstk.hrl").
 
@@ -76,14 +75,12 @@
 %% Purpose    	: Create a widget of the type defined in this module.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, GstkId, Opts) ->
-    TkW = gstk_generic:mk_tkw_child(DB,GstkId),
-    MPreCmd = ["frame ", TkW],
-    PlaceCmd = [";place ", TkW],
-    Ngstkid = GstkId#gstkid{widget=TkW},
-    case gstk_generic:make_command(Opts, Ngstkid,TkW, MPreCmd, PlaceCmd, DB) of
-	{error,Reason} -> {error,Reason};
+    TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+    Ngstkid = GstkId#gstkid{widget = TkW},
+    case gstk_generic:make_command(Opts, Ngstkid, TkW, ["frame ", TkW], [";place ", TkW], DB) of
+	{error, _Reason} = E -> E;
 	Cmd when is_list(Cmd) ->
-	    gstk:exec([Cmd,";pack ", TkW, " -side top -fill x;"]),
+	    gstk:exec([Cmd, ";pack ", TkW, " -side top -fill x;"]),
 	    Ngstkid
     end.
 
@@ -96,11 +93,8 @@ create(DB, GstkId, Opts) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    TkW = Gstkid#gstkid.widget,
-    SimplePreCmd = [TkW, " conf"],
-    PlacePreCmd = ["place ", TkW],
-    gstk_generic:mk_cmd_and_exec(Opts,Gstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+    gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, [TkW, " conf"], ["place ", TkW], DB).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -108,9 +102,7 @@ config(DB, Gstkid, Opts) ->
 %% Args        	: Opt     - An option to read
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -120,24 +112,16 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    Gstkid#gstkid.widget.
-
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+    TkW.
 
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) 
-when Cgstkid#gstkid.objtype==menubutton ->
-    case gstk_db:lookup_def(Pgstkid,menubutton,bg) of
-	false ->
-	    MbarTkW=Pgstkid#gstkid.widget,
-	    Color=tcl2erl:ret_color([MbarTkW," cg -bg"]),
-	    gstk_db:insert_def(Pgstkid,menubutton,{bg,Color});
-	_ -> done
-    end,
-    gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
+mk_create_opts_for_child(DB, #gstkid{objtype = menubutton} = Cgstkid, Pgstkid, Opts) ->
+    gstk_db:lookup_def(Pgstkid, menubutton, bg) orelse
+	gstk_db:insert_def(Pgstkid, menubutton, {bg, tcl2erl:ret_color([Pgstkid#gstkid.widget, " cg -bg"])}),
+    gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
 
 %%-----------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -149,13 +133,13 @@ when Cgstkid#gstkid.objtype==menubutton
 %%		  TkW     - The  tk-widget
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option,_Gstkid,_TkW,_DB,_) ->
-    case Option of
-	{bg,          Color} -> {s, [" -bg ", gstk:to_color(Color)]};
-	{height,     Height} -> {s, [" -height ", gstk:to_ascii(Height)]};
-	_                    -> invalid_option
-    end.
+option(Option, _Gstkid, _TkW, _DB, _) -> option(Option).
+
+option({bg, Color}) -> option_s([" -bg ", gstk:to_color(Color)]);
+option({height, Height}) -> option_s([" -height ", gstk:to_ascii(Height)]);
+option(_Option) -> invalid_option.
 
+option_s(L) -> {s, L}.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
@@ -163,14 +147,16 @@ option(Option,_Gstkid,_TkW,_DB,_) ->
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,GstkId,TkW,_DB,_) ->
-    case Option of
-	bg            -> tcl2erl:ret_color([TkW," cg -bg"]);
-	height        -> tcl2erl:ret_int(["update idletasks;winfo he ",TkW]);
-	_ -> {bad_result, {GstkId#gstkid.objtype, invalid_option, Option}}
+read_option(Option, GstkId, TkW, _DB, _) -> read_option(Option, GstkId, TkW).
+
+read_option(Option, GstkId, TkW) ->
+    case read_option(Option, TkW) of
+	invalid_option -> {bad_result, {GstkId#gstkid.objtype, invalid_option, Option}};
+	O -> O
     end.
 
+read_option(bg, TkW) -> tcl2erl:ret_color([TkW, " cg -bg"]);
+read_option(height, TkW) -> tcl2erl:ret_int(["update idletasks;winfo he ", TkW]);
+read_option(_Option, _TkW) -> invalid_option.
 
 %% ----- Done -----
-
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_menubutton.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menubutton.erl
--- otp_src_19.0.5/lib/gs/src/gstk_menubutton.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menubutton.erl	2016-08-25 16:37:44.565693335 +0300
@@ -31,8 +31,8 @@
 %%  Attributes:
 %%	activebg		Color
 %%	activefg		Color
-%%	align			n,w,s,e,nw,se,ne,sw,center
-%%	anchor			n,w,s,e,nw,se,ne,sw,center
+%%	align			n, w,s, e,nw, se, ne, sw, center
+%%	anchor			n, w,s, e,nw, se, ne, sw, center
 %%	bg			Color
 %%	bw			Int
 %%	data			Data
@@ -85,8 +85,7 @@
 %%	focus			?????? (-takefocus)
 %%
 
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5,
-	 mk_create_opts_for_child/4]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5, mk_create_opts_for_child/4]).
 
 -include("gstk.hrl").
 
@@ -98,18 +97,17 @@
 %% Purpose    	: Create a widget of the type defined in this module.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, GstkId, Opts) ->
-    TkW = gstk_generic:mk_tkw_child(DB,GstkId),
-    NGstkId=GstkId#gstkid{widget=TkW},
-    PlacePreCmd = [";place ", TkW],
-    case gstk_generic:make_command(Opts, NGstkId, TkW, "", PlacePreCmd, DB) of
-	{error,Reason} -> {error,Reason};
+    TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+    NGstkId = GstkId#gstkid{widget = TkW},
+    case gstk_generic:make_command(Opts, NGstkId, TkW, "", [";place ", TkW], DB) of
+	{error, _Reason} = E -> E;
 	Cmd when is_list(Cmd) ->
-	    gstk:exec(["menubutton ", TkW," -padx 4 -pady 3",Cmd]),
+	    gstk:exec(["menubutton ", TkW, " -padx 4 -pady 3", Cmd]),
 	    NGstkId
     end.
 
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
-    gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+    gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
@@ -120,11 +118,8 @@ mk_create_opts_for_child(DB,Cgstkid, Pgs
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    TkW = Gstkid#gstkid.widget,
-    SimplePreCmd = [TkW, " conf"],
-    PlacePreCmd = [";place ", TkW],
-    gstk_generic:mk_cmd_and_exec(Opts,Gstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+    gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -135,8 +130,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    gstk_generic:read_option(DB, Gstkid, Opt).
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -147,12 +141,11 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    Gstkid#gstkid.widget.
+    TkW.
 
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%-----------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -167,20 +160,23 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
-    case Option of
-	{anchor,        How} -> fix_anchor(How, Gstkid, TkW, DB);
-	{disabledfg,  Color} -> {s, [" -disabledf ", gstk:to_color(Color)]};
-	{height,     Height} -> {s, [" -he ", gstk:to_ascii(Height)]};
-	{side,         Side} -> fix_side(Side, Gstkid, TkW, DB);
-	{underline,     Int} -> {s, [" -und ", gstk:to_ascii(Int)]};
-	{width,       Width} -> {s, [" -wi ", gstk:to_ascii(Width)]};
-	{wraplength,    Int} -> {s, [" -wr ", gstk:to_ascii(Int)]};
-	{x,               X} -> fix_placement(x, X, Gstkid, TkW, DB);
-	{y,               Y} -> fix_placement(y, Y, Gstkid, TkW, DB);
-	_                    -> invalid_option
-    end.
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
+
+option({anchor, How}, Gstkid, TkW, DB) -> fix_anchor(How, Gstkid, TkW, DB);
+option({side, Side}, Gstkid, TkW, DB) -> fix_side(Side, Gstkid, TkW, DB);
+option({T, V}, Gstkid, TkW, DB) when T =:= x; T =:= y -> fix_placement(T, V, Gstkid, TkW, DB);
+option(Option, _Gstkid, _TkW, _DB) -> option(Option).
+
+option({disabledfg, Color}) -> option_s([" -disabledf ", gstk:to_color(Color)]);
+option({height, Height}) -> option_s(" -he ", Height);
+option({width, Width}) -> option_s(" -wi ", Width);
+option({underline, Int}) -> option_s(" -und ", Int);
+option({wraplength, Int}) -> option_s(" -wr ", Int);
+option(_Option) -> invalid_option.
+
+option_s(Str, Val) -> option_s([Str, gstk:to_ascii(Val)]).
 
+option_s(L) -> {s, L}.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/3
@@ -192,47 +188,45 @@ option(Option, Gstkid, TkW, DB,_) ->
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,GstkId,TkW,_DB,_) ->
-    case Option of
-	anchor        -> tcl2erl:ret_place(anchor, TkW);
-	disabledfg    -> tcl2erl:ret_color([TkW," cg -disabledfo"]);
-	height        -> tcl2erl:ret_int([TkW," cg -he"]);
-	side          -> tcl2erl:ret_pack(side, TkW);
-	underline     -> tcl2erl:ret_int([TkW," cg -underl"]);
-	width         -> tcl2erl:ret_int([TkW," cg -wi"]);
-	wraplength    -> tcl2erl:ret_int([TkW," cg -wr"]);
-	x             -> tcl2erl:ret_place(x, TkW);
-	y             -> tcl2erl:ret_place(y, TkW);
-	_ -> {error,{invalid_option,Option, GstkId#gstkid.objtype}}
+read_option(Option, GstkId, TkW, _DB, _) -> read_option(Option, GstkId, TkW).
+
+read_option(Option, GstkId, TkW) ->
+    case read_option(Option, TkW) of
+	invalid_option -> {error, {invalid_option, Option, GstkId#gstkid.objtype}};
+	O -> O
     end.
 
+read_option(disabledfg, TkW) -> tcl2erl:ret_color([TkW, " cg -disabledfo"]);
+read_option(height, TkW) -> ret_int(" cg -he", TkW);
+read_option(width, TkW) -> ret_int(" cg -wi", TkW);
+read_option(underline, TkW) -> ret_int(" cg -underl", TkW);
+read_option(wraplength, TkW) -> ret_int(" cg -wr", TkW);
+read_option(side, TkW) -> tcl2erl:ret_pack(side, TkW);
+read_option(T, TkW) when T =:= anchor; T =:= x; T =:= y -> tcl2erl:ret_place(T, TkW);
+read_option(_Option, _TkW) -> invalid_option.
+
+ret_int(Str, TkW) -> tcl2erl:ret_int([TkW, Str]).
+
 %%-----------------------------------------------------------------------------
 %%			       PRIMITIVES
 %%-----------------------------------------------------------------------------
 
-fix_placement(Attr, Value, Gstkid, _TkW, DB) ->
-    Pgstkid = gstk_db:lookup_gstkid(DB, Gstkid#gstkid.parent),
-    case Pgstkid#gstkid.objtype of
-	menubar -> invalid_option;
-	_       -> {p, [" -", atom_to_list(Attr), " ", gstk:to_ascii(Value)]}
+fix_placement(Attr, Value, #gstkid{parent = Parent}, _TkW, DB) ->
+    case gstk_db:lookup_gstkid(DB, Parent) of
+	#gstkid{objtype = menubar} -> invalid_option;
+	_ -> {p, [" -", atom_to_list(Attr), " ", gstk:to_ascii(Value)]}
     end.
 
-	
-fix_anchor(How, Gstkid, TkW, DB) ->
-    Pgstkid = gstk_db:lookup_gstkid(DB, Gstkid#gstkid.parent),
-    case Pgstkid#gstkid.objtype of
-	menubar -> {c, ["pack ", TkW, " -an ", gstk:to_ascii(How)]};
-	_       -> {p,   [" -anch ", gstk:to_ascii(How)]}
+fix_anchor(How, #gstkid{parent = Parent}, TkW, DB) ->
+    case gstk_db:lookup_gstkid(DB, Parent) of
+	#gstkid{objtype = menubar} -> {c, ["pack ", TkW, " -an ", gstk:to_ascii(How)]};
+	_ -> {p, [" -anch ", gstk:to_ascii(How)]}
     end.
 
-
-fix_side(Side, Gstkid, TkW, DB) ->
-    Pgstkid = gstk_db:lookup_gstkid(DB, Gstkid#gstkid.parent),
-    case Pgstkid#gstkid.objtype of
-	menubar -> {c, ["pack ", TkW, " -fill y -si ", gstk:to_ascii(Side)]};
-        _       -> none
+fix_side(Side, #gstkid{parent = Parent}, TkW, DB) ->
+    case gstk_db:lookup_gstkid(DB, Parent) of
+	#gstkid{objtype = menubar} -> {c, ["pack ", TkW, " -fill y -si ", gstk:to_ascii(Side)]};
+	_ -> none
     end.
 
-
 %% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_menu.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menu.erl
--- otp_src_19.0.5/lib/gs/src/gstk_menu.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menu.erl	2016-08-25 16:37:44.565693335 +0300
@@ -24,7 +24,8 @@
 %%------------------------------------------------------------------------------
 
 -module(gstk_menu).
--compile([{nowarn_deprecated_function,{gs,error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, error, 2}}]).
 
 %%------------------------------------------------------------------------------
 %% 			    MENU OPTIONS
@@ -63,10 +64,10 @@
 %%	type
 %%
 %%  Not Implemented:
-%%	post			{X,Y}
+%%	post			{X, Y}
 %%	unpost
-%%	align			n,w,s,e,nw,se,ne,sw,center
-%%	anchor			n,w,s,e,nw,se,ne,sw,center
+%%	align			n, w,s, e,nw, se, ne, sw, center
+%%	anchor			n, w,s, e,nw, se, ne, sw, center
 %%	cursor			??????
 %%	focus			?????? (-takefocus)
 %%	height			Int
@@ -76,9 +77,8 @@
 %%	y			Int	(valid only for popup menus)
 %%
 
--export([create/3, config/3, read/3, delete/2, event/5,option/5,read_option/5]).
--export([delete_menuitem/3, insert_menuitem/4, lookup_menuitem_pos/3,
-	 mk_create_opts_for_child/4]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
+-export([delete_menuitem/3, insert_menuitem/4, lookup_menuitem_pos/3, mk_create_opts_for_child/4]).
 
 -include("gstk.hrl").
 
@@ -89,50 +89,34 @@
 %% Function   	: create/3
 %% Purpose    	: Create a widget of the type defined in this module.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-create(DB, GstkId, Opts) ->
-    #gstkid{parent=Parent,owner=Owner,objtype=Objtype}=GstkId,
-    Pgstkid = gstk_db:lookup_gstkid(DB, Parent, Owner),
-    Oref = gstk_db:counter(DB, Objtype),
-    PF = gstk_widgets:suffix(Objtype),
-    case Pgstkid#gstkid.objtype of
-	menuitem ->
-	    PMenu = Pgstkid#gstkid.parent,
-	    PMgstkid = gstk_db:lookup_gstkid(DB, PMenu, Owner),
-	    PMW = PMgstkid#gstkid.widget,
-	    Index = gstk_menu:lookup_menuitem_pos(DB, PMgstkid, Pgstkid#gstkid.id),
-	    TkW = lists:concat([PMW, PF, Oref]),
-	    Gstkid=GstkId#gstkid{widget=TkW, widget_data=[]},
-	    MPreCmd = ["menu ", TkW, " -tearoff 0 -relief raised -bo 2"],
-	    MPostCmd = [$;,PMW," entryco ",gstk:to_ascii(Index)," -menu ",TkW],
-	    case gstk_generic:make_command(Opts, Gstkid, TkW, "", "", DB) of
-		{error,Reason} -> {error,Reason};
-		Cmd when is_list(Cmd) ->
-		    gstk:exec([MPreCmd,Cmd,MPostCmd]),
-		    Gstkid
-	    end;
-	OtherParent ->
-	    true = lists:member(OtherParent,
-				%% grid+canvas har skumma coord system
-				[menubutton,window,frame]),
-	    PW = Pgstkid#gstkid.widget,
-	    TkW = lists:concat([PW, PF, Oref]),
-	    Gstkid=GstkId#gstkid{widget=TkW, widget_data=[]},
-	    MPreCmd = ["menu ", TkW, " -tearoff 0 -relief raised -bo 2 "],
-	    MPostCmd = if OtherParent == menubutton ->
-			       [$;, PW, " conf -menu ", TkW];
-			  true -> []
-		       end,
-	    case gstk_generic:make_command(Opts, Gstkid, TkW, "","", DB) of
-		{error,Reason} -> {error,Reason};
-		Cmd when is_list(Cmd) ->
-		    gstk:exec([MPreCmd,Cmd,MPostCmd]),
-		    Gstkid
-	    end
+create(DB, #gstkid{parent = Parent, owner = Owner, objtype = Objtype} = GstkId, Opts) ->
+    {PMW, MPostCmd} = case gstk_db:lookup_gstkid(DB, Parent, Owner) of
+			  #gstkid{objtype = menuitem, parent = P, id = Id} ->
+			      PMgstkid = #gstkid{widget = PW} = gstk_db:lookup_gstkid(DB, P, Owner),
+			      {PW, [" entryco ", gstk:to_ascii(gstk_menu:lookup_menuitem_pos(DB, PMgstkid, Id)), " -menu "]};
+			  #gstkid{objtype = OtherParent, widget = PW} ->
+			      true = lists:member(OtherParent,
+						  %% grid+canvas har skumma coord system
+						  [menubutton, window, frame]),
+			      {PW, if
+				       OtherParent =:= menubutton -> [" conf -menu "];
+				       true -> []
+				   end}
+		      end,
+    TkW = lists:concat([PMW, gstk_widgets:suffix(Objtype), gstk_db:counter(DB, Objtype)]),
+    Gstkid = GstkId#gstkid{widget = TkW, widget_data = []},
+    case gstk_generic:make_command(Opts, Gstkid, TkW, "", "", DB) of
+	{error, _Reason} = E -> E;
+	Cmd when is_list(Cmd) ->
+	    gstk:exec([["menu ", TkW, " -tearoff 0 -relief raised -bo 2 "], Cmd, if
+										     MPostCmd =:= [] -> [];
+										     true -> [$;, PMW|MPostCmd] ++ [TkW]
+										 end]),
+	    Gstkid
     end.
 
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
-    gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
-
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+    gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
@@ -143,10 +127,8 @@ mk_create_opts_for_child(DB,Cgstkid, Pgs
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    TkW = Gstkid#gstkid.widget,
-    PreCmd = [TkW, " conf"],
-    gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, PreCmd, "", DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+    gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, [TkW, " conf"], "", DB).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -157,9 +139,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -169,12 +149,11 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    Gstkid#gstkid.widget.
+    TkW.
 
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%------------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -189,15 +168,21 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
-    case Option of
-	{activebw,      Int} -> {s, [" -activebo ", gstk:to_ascii(Int)]};
-	{disabledfg,  Color} -> {s, [" -disabledf ", gstk:to_color(Color)]};
-	{selectcolor, Color} -> {s, [" -selectc ", gstk:to_color(Color)]};
-	{post_at,     {X,Y}} -> post_at(X,Y,Gstkid,TkW,DB);
-	_                    -> invalid_option
-    end.
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
 
+option({post_at, {X, Y}}, Gstkid, TkW, DB) -> post_at(X, Y, Gstkid, TkW, DB);
+option(Option, _Gstkid, _TkW, _DB) -> option(Option).
+
+option({activebw, Int}) -> option_s(" -activebo ", gstk:to_ascii(Int));
+option({disabledfg, Color}) -> to_color(" -disabledf ", Color);
+option({selectcolor, Color}) -> to_color(" -selectc ", Color);
+option(_Option) -> invalid_option.
+
+to_color(Str, Color) -> option_s(Str, gstk:to_color(Color)).
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
@@ -209,21 +194,26 @@ option(Option, Gstkid, TkW, DB,_) ->
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option, Gstkid, TkW, _DB, _AItem) ->
-    case Option of
-	activebw      -> tcl2erl:ret_int([TkW," cg -activebo"]);
-	disabledfg    -> tcl2erl:ret_color([TkW," cg -disabledfo"]);
-	selectcolor   -> tcl2erl:ret_color([TkW," cg -selectc"]);
-	_ -> {error,{invalid_option,Option, Gstkid#gstkid.objtype}}
+read_option(Option, Gstkid, TkW, _DB, _AItem) -> read_option(Option, Gstkid, TkW).
+
+read_option(Option, Gstkid, TkW) ->
+    case read_option(Option, TkW) of
+	invalid_option -> {error, {invalid_option, Option, Gstkid#gstkid.objtype}};
+	O -> O
     end.
 
-post_at(X,Y,Gstkid,TkW,DB) ->
-    Pgstkid = gstk_db:lookup_gstkid(DB, Gstkid#gstkid.parent),
-    PtkW = Pgstkid#gstkid.widget,
-    RootX = tcl2erl:ret_int(["winfo rootx ",PtkW]),
-    RootY = tcl2erl:ret_int(["winfo rooty ",PtkW]),
-    {c,[" tk_popup ",TkW," ",gstk:to_ascii(RootX+X)," ",gstk:to_ascii(RootY+Y)]}.
+read_option(activebw, TkW) -> tcl2erl:ret_int([TkW, " cg -activebo"]);
+read_option(disabledfg, TkW) -> ret_color(" cg -disabledfo", TkW);
+read_option(selectcolor, TkW) -> ret_color(" cg -selectc", TkW);
+read_option(_Option, _TkW) -> invalid_option.
 
+ret_color(Str, TkW) -> tcl2erl:ret_color([TkW, Str]).
+
+post_at(X, Y, #gstkid{parent = Parent}, TkW, DB) ->
+    #gstkid{widget = PtkW} = gstk_db:lookup_gstkid(DB, Parent),
+    {c, [" tk_popup ", TkW,
+	 " ", gstk:to_ascii(tcl2erl:ret_int(["winfo rootx ", PtkW]) + X),
+	 " ", gstk:to_ascii(tcl2erl:ret_int(["winfo rooty ", PtkW]) + Y)]}.
 
 %%-----------------------------------------------------------------------------
 %%			       PRIMITIVES
@@ -233,36 +223,25 @@ post_at(X,Y,Gstkid,TkW,DB) ->
 %% Tk menuitems are numbered from 0, thus we have to recalc the position.
 %%----------------------------------------------------------------------
 insert_menuitem(DB, MenuId, ItemId, Pos) ->
-    Mgstkid = gstk_db:lookup_gstkid(DB, MenuId),
-    Items = Mgstkid#gstkid.widget_data,
-    NewItems = insert_at(ItemId, Pos+1, Items),
-    gstk_db:update_widget(DB, Mgstkid#gstkid{widget_data=NewItems}).
-
+    Mgstkid = #gstkid{widget_data = Items} = gstk_db:lookup_gstkid(DB, MenuId),
+    gstk_db:update_widget(DB, Mgstkid#gstkid{widget_data = insert_at(ItemId, Pos + 1, Items)}).
 
 delete_menuitem(DB, MenuId, ItemId) ->
-    Mgstkid = gstk_db:lookup_gstkid(DB, MenuId),
-    Items = Mgstkid#gstkid.widget_data,
-    NewItems = lists:delete(ItemId, Items),
-    gstk_db:insert_widget(DB, Mgstkid#gstkid{widget_data=NewItems}).
-
+    Mgstkid = #gstkid{widget_data = Items} = gstk_db:lookup_gstkid(DB, MenuId),
+    gstk_db:insert_widget(DB, Mgstkid#gstkid{widget_data = lists:delete(ItemId, Items)}).
 
-lookup_menuitem_pos(_DB, Mgstkid, ItemId) ->
-    Items = Mgstkid#gstkid.widget_data,
-    find_pos(ItemId, Items) - 1.
+lookup_menuitem_pos(_DB, #gstkid{widget_data = Items}, ItemId) -> find_pos(ItemId, Items) - 1.
 
 %%----------------------------------------------------------------------
 %% Generic list processing
 %%----------------------------------------------------------------------
-find_pos(ItemId, Items) ->
-    find_pos(ItemId, Items, 1).
+find_pos(ItemId, Items) -> find_pos(ItemId, Items, 1).
 
 find_pos(_ItemId, [], _N) -> gs:error("Couldn't find item in menu~n", []);
 find_pos(ItemId, [ItemId|_Items], N) -> N;
-find_pos(ItemId, [_|Items], N) ->
-    find_pos(ItemId, Items, N + 1).
+find_pos(ItemId, [_|Items], N) -> find_pos(ItemId, Items, N + 1).
 
-insert_at(Elem, 1, L) -> [Elem | L];
-insert_at(Elem, N, [H|T]) ->
-    [H|insert_at(Elem, N-1, T)].
+insert_at(Elem, 1, L) -> [Elem|L];
+insert_at(Elem, N, [H|T]) -> [H|insert_at(Elem, N - 1, T)].
 
 %% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_menuitem.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menuitem.erl
--- otp_src_19.0.5/lib/gs/src/gstk_menuitem.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menuitem.erl	2016-08-25 16:37:44.565693335 +0300
@@ -24,7 +24,8 @@
 %% ------------------------------------------------------------
 
 -module(gstk_menuitem).
--compile([{nowarn_deprecated_function,{gs,error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, error, 2}}]).
 
 %%-----------------------------------------------------------------------------
 %% 			    MENUITEM OPTIONS
@@ -66,8 +67,7 @@
 %%	read menu on cascades
 %%
 
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
-	option/5,read_option/5,mk_create_opts_for_child/4]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5, mk_create_opts_for_child/4]).
 -include("gstk.hrl").
 
 %%-----------------------------------------------------------------------------
@@ -77,55 +77,42 @@
 %% Function   	: create/3
 %% Purpose    	: Create a widget of the type defined in this module.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-create(DB, GstkId, Opts) ->
-    #gstkid{parent=Parent,owner=Owner,id=Id}=GstkId,
-    Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
-    TkMenu = Pgstkid#gstkid.widget,
-    Widget = "",
+-define(Widget, "").
+create(DB, #gstkid{parent = Parent, owner = Owner, id = Id} = GstkId, Opts) ->
+    #gstkid{widget = TkMenu} = gstk_db:lookup_gstkid(DB, Parent),
     {Index, Type, Options} = parse_opts(Opts, TkMenu),
     PreCmd = [TkMenu, " insert ", gstk:to_ascii(Index)],
-    InsertArgs = [DB, Parent,Id, Index],
+    InsertArgs = [DB, Parent, Id, Index],
     case Type of
 	check ->
 	    {G, GID, NOpts} = fix_group(Options, DB, Owner),
-	    TypeCmd = " ch",
-	    Ngstkid=GstkId#gstkid{widget=Widget,widget_data={Type, G, GID}},
-	    GenArgs = [NOpts,Ngstkid,TkMenu,"","",DB,{Type,Index}],
-	    CallArgs = [PreCmd,TypeCmd],
-	    mk_it(GenArgs,CallArgs,InsertArgs,Ngstkid);
+	    Ngstkid = GstkId#gstkid{widget = ?Widget, widget_data = {Type, G, GID}},
+	    mk_it([NOpts, Ngstkid, TkMenu, "", "", DB, {Type, Index}], [PreCmd, " ch"], InsertArgs, Ngstkid);
 	radio ->
 	    {G, GID, V, NOpts} = fix_group_and_value(Options, DB, Owner),
-	    Ngstkid=GstkId#gstkid{widget=Widget, widget_data={Type,G,GID,V}},
-	    TypeCmd = " ra",
-	    GenArgs = [NOpts,Ngstkid,TkMenu,"", "",DB,{Type,Index}],
-	    CallArgs = [PreCmd,TypeCmd],
-	    mk_it(GenArgs,CallArgs,InsertArgs,Ngstkid);
+	    Ngstkid = GstkId#gstkid{widget = ?Widget, widget_data = {Type, G, GID, V}},
+	    mk_it([NOpts, Ngstkid, TkMenu, "", "", DB, {Type, Index}], [PreCmd, " ra"], InsertArgs, Ngstkid);
 	_ ->
-	    Ngstkid=GstkId#gstkid{widget=Widget, widget_data=Type},
-	    TypeCmd = case Type of
-			  normal    -> " co";
-			  separator -> " se";
-			  cascade   -> " ca"
-		      end,
-	    GenArgs = [Options,Ngstkid,TkMenu,"","",DB,{Type,Index}],
-	    CallArgs = [PreCmd,TypeCmd],
-	    mk_it(GenArgs,CallArgs,InsertArgs,Ngstkid)
+	    Ngstkid = GstkId#gstkid{widget = ?Widget, widget_data = Type},
+	    mk_it([Options, Ngstkid, TkMenu, "", "", DB, {Type, Index}],
+		  [PreCmd, proplists:get_value(Type, [{normal, " co"}, {separator, " se"}, {cascade, " ca"}])],
+		  InsertArgs,
+		  Ngstkid)
     end.
 
-mk_it(GenArgs,CallArgs,InsertArgs,Ngstkid) ->
-    case apply(gstk_generic,make_command,GenArgs) of
-	{error,Reason} -> {error,Reason};
-	Cmd when is_list(Cmd) ->
-	    case apply(gstk,call,[[CallArgs|Cmd]]) of
-		{result,_} ->
-		    apply(gstk_menu,insert_menuitem,InsertArgs),
-		    Ngstkid;
-		Bad_Result -> {error,Bad_Result}
-	    end
+mk_it(GenArgs, CallArgs, InsertArgs, Ngstkid) ->
+    case apply(gstk_generic, make_command, GenArgs) of
+	{error, _Reason} = Bad_Result -> Bad_Result;
+	Cmd when is_list(Cmd) -> case apply(gstk, call, [[CallArgs|Cmd]]) of
+				     {result, _} ->
+					 apply(gstk_menu, insert_menuitem, InsertArgs),
+					 Ngstkid;
+				     Bad_Result -> {error, Bad_Result}
+				 end
     end.
 
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
-    gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+    gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
@@ -141,31 +128,16 @@ mk_create_opts_for_child(DB,Cgstkid, Pgs
 % entry in the middle of the meny, don't the entrys after that one
 % renumber?
 
-config(DB, Gstkid, Options) ->
-    Parent = Gstkid#gstkid.parent,
-    Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
-    TkMenu = Pgstkid#gstkid.widget,
-    case Gstkid#gstkid.widget_data of
-	{Type, _, _, _} ->
-	    Owner = Gstkid#gstkid.owner,
-	    {NOpts, NGstkid} = fix_group_and_value(Options, DB, Owner, Gstkid),
-	    Index = gstk_menu:lookup_menuitem_pos(DB, Pgstkid, NGstkid#gstkid.id),
-	    PreCmd = [TkMenu, " entryco ", gstk:to_ascii(Index)],
-	    gstk_generic:mk_cmd_and_exec(NOpts,NGstkid,TkMenu,PreCmd,"",DB,
-					{Type,Index});
-	{Type, _, _} ->
-	    Owner = Gstkid#gstkid.owner,
-	    {NOpts, NGstkid} = fix_group(Options, DB, Owner, Gstkid),
-	    Index = gstk_menu:lookup_menuitem_pos(DB, Pgstkid, NGstkid#gstkid.id),
-	    PreCmd = [TkMenu, " entryco ", gstk:to_ascii(Index)],
-	    gstk_generic:mk_cmd_and_exec(NOpts,NGstkid,TkMenu,PreCmd,"",DB,
-					{Type,Index});
-	Type ->
-	    Index = gstk_menu:lookup_menuitem_pos(DB, Pgstkid, Gstkid#gstkid.id),
-	    PreCmd = [TkMenu, " entryco ", gstk:to_ascii(Index)],
-	    gstk_generic:mk_cmd_and_exec(Options,Gstkid,TkMenu,PreCmd,"",
-					DB, {Type,Index})
-    end.
+config(DB, #gstkid{id = Id, widget = TkMenu, parent = Parent} = Gstkid, Options) ->
+    Index = gstk:to_ascii(gstk_menu:lookup_menuitem_pos(DB, gstk_db:lookup_gstkid(DB, Parent), Id)),
+    {{NOpts, NGstkid}, Type} = get_config(DB, Gstkid, Options),
+    gstk_generic:mk_cmd_and_exec(NOpts, NGstkid, TkMenu, [TkMenu, " entryco ", Index], "", DB, {Type, Index}).
+
+get_config(DB, #gstkid{owner = Owner, widget_data = {Type, _, _, _}} = Gstkid, Options) ->
+    {fix_group_and_value(Options, DB, Owner, Gstkid), Type};
+get_config(DB, #gstkid{owner = Owner, widget_data = {Type, _, _}} = Gstkid, Options) ->
+    {fix_group(Options, DB, Owner, Gstkid), Type};
+get_config(_DB, #gstkid{widget_data = Type} = Gstkid, Options) -> {{Options, Gstkid}, Type}.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -176,9 +148,7 @@ config(DB, Gstkid, Options) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -188,16 +158,14 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
-    Parent = Gstkid#gstkid.parent,
-    Id = Gstkid#gstkid.id,
+delete(DB, #gstkid{parent = Parent, id = Id, widget_data = D} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    case Gstkid#gstkid.widget_data of
-	{radio, _, Gid, _} -> gstk_db:delete_bgrp(DB, Gid);
-	{check, _, Gid}    -> gstk_db:delete_bgrp(DB, Gid);
-	_Other              -> true
-    end,
-   {Parent, Id, gstk_menuitem, [Id, Parent]}.
+    delete_bgrp(DB, D),
+    {Parent, Id, gstk_menuitem, [Id, Parent]}.
+
+delete_bgrp(DB, {radio, _, Gid, _}) -> gstk_db:delete_bgrp(DB, Gid);
+delete_bgrp(DB, {check, _, Gid}) -> gstk_db:delete_bgrp(DB, Gid);
+delete_bgrp(_DB, _D) -> true.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: destroy/3
@@ -207,13 +175,10 @@ delete(DB, Gstkid) ->
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 destroy(DB, Id, Parent) ->
-    Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
-    PW = Pgstkid#gstkid.widget,    
-    Idx = gstk_menu:lookup_menuitem_pos(DB, Pgstkid, Id),
+    Idx = gstk_menu:lookup_menuitem_pos(DB, #gstkid{widget = PW} = gstk_db:lookup_gstkid(DB, Parent), Id),
     gstk_menu:delete_menuitem(DB, Parent, Id),
     gstk:exec([PW, " delete ", gstk:to_ascii(Idx)]).
 
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: event/5
 %% Purpose    	: Construct the event and send it to the owner of the widget
@@ -223,25 +188,13 @@ destroy(DB, Id, Parent) ->
 %%		
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-event(DB, Gstkid, Etype, Edata, Args) ->
-    Arg2 = 
-	case Gstkid#gstkid.widget_data of
-	    {radio, G, _GID, V} ->
-		[_Grp, Text, Idx | Args1] = Args,
-		[Text, Idx, G, V | Args1];
-	    {check, G, _Gid} ->
-		[Bool, Text, Idx | Args1] = Args,
-		RBool = case Bool of
-			    0 -> false;
-			    1 -> true
-			end,
-		[Text, Idx, G, RBool | Args1];
-	    _Other2 ->
-		Args
-	end,
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Arg2).
-
-
+event(DB, #gstkid{widget_data = {radio, G, _GID, V}} = Gstkid, Etype, Edata, [_Grp, Text, Idx|Args]) ->
+    gstk_generic:event(DB, Gstkid, Etype, Edata, [Text, Idx, G, V|Args]);
+event(DB, #gstkid{widget_data = {check, G, _Gid}} = Gstkid, Etype, Edata, [0, Text, Idx|Args]) ->
+    gstk_generic:event(DB, Gstkid, Etype, Edata, [Text, Idx, G, false|Args]);
+event(DB, #gstkid{widget_data = {check, G, _Gid}} = Gstkid, Etype, Edata, [1, Text, Idx|Args]) ->
+    gstk_generic:event(DB, Gstkid, Etype, Edata, [Text, Idx, G, true|Args]);
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%-----------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -253,64 +206,59 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%		  TkW     - The  tk-widget
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option({click,true}, _Gstkid, _TkW, _DB, {separator,_Index}) ->
-    none;  % workaround to be able to have {click,true} as default.
-option(_Option, _Gstkid, _TkW, _DB, {separator,_Index}) ->
-    invalid_option;
+% workaround to be able to have {click, true} as default.
+option({click, On}, Gstkid, TkW, DB, {Kind, Index}) -> cbind(On, Gstkid, TkW, Index, Kind, DB);
+option({menu, {Menu, _RestOfExternalId}}, _Gstkid, _TkW, DB, {cascade, _Index}) ->
+    #gstkid{widget = MenuW} = gstk_db:lookup_gstkid(DB, Menu),
+    option_s(" -menu ", MenuW);
+option({font, Font} = Option, Gstkid, _TkW, DB, {_Kind, _Index}) when is_tuple(Font) ->
+    gstk_db:insert_opt(DB, Gstkid, Option),
+    option_s(" -font ", gstk_font:choose_ascii(DB, Font));
+option(Option, _Gstkid, TkW, _DB, KI) -> option(Option, KI, TkW).
 
-option({menu,{Menu,_RestOfExternalId}}, _Gstkid, _TkW, DB, {cascade,_Index}) ->
-    Mgstkid = gstk_db:lookup_gstkid(DB, Menu),
-    MenuW = Mgstkid#gstkid.widget,
-    {s, [" -menu ", MenuW]};
+option({click, true}, {separator, _Index}, _TkW) -> none;
+option(_Option, {separator, _Index}, _TkW) -> invalid_option;
+option({select, false}, {check, Index}, TkW) ->
+    option_c(["set x [", TkW, " entrycg ", gstk:to_ascii(Index), " -var];global $x;set $x 0"]);
+option({select, true}, {check, Index}, TkW) ->
+    option_c(["set x [", TkW, " entrycg ", gstk:to_ascii(Index), " -var];global $x;set $x 1"]);
+option({value, Val}, {radio, _Index}, _TkW) ->
+    option_s(" -val ", gstk:to_ascii(Val));
+option({select, false}, {radio, Index}, TkW) ->
+    option_c(["set x [", TkW, " entrycg ", gstk:to_ascii(Index), " -var];global $x;set $x {}"]);
+option({select, true}, {radio, Index}, TkW) ->
+    option_c(["set x [", TkW, " entrycg ", gstk:to_ascii(Index), " -var]; set y [", TkW, " entrycg ", gstk:to_ascii(Index), " -val]; global $x; set $x $y"]);
+option(activate, {_Kind, Index}, TkW) -> option_c([TkW, " act ", gstk:to_ascii(Index)]);
+option(invoke, {_Kind, Index}, TkW) -> option_c([TkW, " inv ", gstk:to_ascii(Index)]);
+option(Option, KI, _TkW) -> option(Option, KI).
 
-option({select,false}, _Gstkid, TkW, _DB, {check,Index}) ->
-    {c, ["set x [", TkW, " entrycg ", gstk:to_ascii(Index),
-	 " -var];global $x;set $x 0"]};
-option({select,true}, _Gstkid, TkW, _DB, {check,Index}) ->
-    {c, ["set x [", TkW, " entrycg ", gstk:to_ascii(Index),
-	 " -var];global $x;set $x 1"]};
+option(Option, {Kind, _Index}) when Kind =:= radio; Kind =:= check ->
+    case Option of
+	{group, Group} -> option_s(" -var ", gstk:to_ascii(Group));
+	{selectbg, Col} -> option_s(" -selectc ", gstk:to_color(Col));
+	_ -> option(Option)
+    end;
+option(Option, _KI) -> option(Option).
 
-option({value,Val}, _Gstkid, _TkW, _DB, {radio,_Index}) ->
-    {s, [" -val ", gstk:to_ascii(Val)]};
-option({select,false}, _Gstkid, TkW, _DB, {radio,Index}) ->
-    {c, ["set x [", TkW, " entrycg ", gstk:to_ascii(Index),
-	 " -var];global $x;set $x {}"]};
-option({select,true}, _Gstkid, TkW, _DB, {radio,Index}) ->
-    {c, ["set x [", TkW, " entrycg ", gstk:to_ascii(Index),
-	 " -var]; set y [", TkW, " entrycg ", gstk:to_ascii(Index),
-	 " -val]; global $x; set $x $y"]};
+option({accelerator, Acc}) -> option_s(" -acc ", gstk:to_ascii(Acc));
+option({label, {image, Img}}) -> option_s([" -bitm @", Img, " -lab {}"]);
+% FIXME: insert -command here.....
+% FIXME: how to get value from image entry???
+option({label, {text, Text}}) -> option_s([" -lab ", gstk:to_ascii(Text), " -bitm {}"]);
+option({underline, Int}) -> option_s(" -underl ", gstk:to_ascii(Int));
+option({activebg, Color}) -> option_s(" -activeba ", gstk:to_color(Color));
+option({activefg, Color}) -> option_s(" -activefo ", gstk:to_color(Color));
+option({bg, Color}) -> option_s(" -backg ", gstk:to_color(Color));
+option({enable, true}) -> option_s(" -st normal");
+option({enable, false}) -> option_s(" -st disabled");
+option({fg, Color}) -> option_s(" -foreg ", gstk:to_color(Color));
+option(_Option) -> invalid_option.
 
-option(Option, Gstkid, TkW, DB, {Kind,Index}) ->
-    case Option of
-	activate  -> {c, [TkW, " act ", gstk:to_ascii(Index)]};
-	invoke    -> {c, [TkW, " inv ", gstk:to_ascii(Index)]};
-	{accelerator,   Acc} -> {s, [" -acc ", gstk:to_ascii(Acc)]};
-	{click,          On} -> cbind(On, Gstkid, TkW, Index, Kind, DB);
-	{font, Font} when is_tuple(Font) ->
-	    gstk_db:insert_opt(DB,Gstkid,Option),
-	    {s, [" -font ", gstk_font:choose_ascii(DB,Font)]};
-	{label, {image,Img}} -> {s, [" -bitm @", Img, " -lab {}"]};
-	% FIXME: insert -command here.....
-	% FIXME: how to get value from image entry???
-	{label, {text,Text}} -> {s, [" -lab ",gstk:to_ascii(Text)," -bitm {}"]};
-	{underline,     Int} -> {s, [" -underl ", gstk:to_ascii(Int)]};
-        {activebg,    Color} -> {s, [" -activeba ", gstk:to_color(Color)]};
-        {activefg,    Color} -> {s, [" -activefo ", gstk:to_color(Color)]};
-        {bg,          Color} -> {s, [" -backg ", gstk:to_color(Color)]};
-        {enable,       true} -> {s, " -st normal"};
-        {enable,      false} -> {s, " -st disabled"};
-        {fg,          Color} -> {s, [" -foreg ", gstk:to_color(Color)]};
-	_Other -> 
-	    case lists:member(Kind,[radio,check]) of
-		true -> 
-		    case Option of
-			{group,Group} -> {s, [" -var ", gstk:to_ascii(Group)]};
-			{selectbg,Col} -> {s,[" -selectc ",gstk:to_color(Col)]};
-			_ -> invalid_option
-		    end;
-		_ -> invalid_option
-	    end
-    end.
+option_c(L) -> {c, L}.
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
@@ -318,75 +266,55 @@ option(Option, Gstkid, TkW, DB, {Kind,In
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,GstkId,_TkW,DB,_) ->
-    ItemId = GstkId#gstkid.id,
-    MenuId = GstkId#gstkid.parent,
+read_option(Option, GstkId, _TkW, DB, _) -> read_option(Option, GstkId, DB).
+
+read_option(click, GstkId, DB) -> gstk_db:is_inserted(DB, GstkId, click);
+read_option(font, GstkId, DB) -> gstk_db:opt(DB, GstkId, font, undefined);
+read_option(Option, #gstkid{id = ItemId, widget = MenuW, parent = MenuId} = GstkId, DB) ->
     MenuGstkid = gstk_db:lookup_gstkid(DB, MenuId),
-    MenuW = MenuGstkid#gstkid.widget,
     Idx = gstk_menu:lookup_menuitem_pos(DB, MenuGstkid, ItemId),
     PreCmd = [MenuW, " entrycg ", gstk:to_ascii(Idx)],
     case Option of
-	accelerator   -> tcl2erl:ret_str([PreCmd, " -acc"]);
-	activebg      -> tcl2erl:ret_color([PreCmd, " -activeba"]);
-	activefg      -> tcl2erl:ret_color([PreCmd, " -activefo"]);
-	bg            -> tcl2erl:ret_color([PreCmd, " -backg"]);
-	fg            -> tcl2erl:ret_color([PreCmd, " -foreg"]);
-	group         -> read_group(GstkId, Option);
-	groupid       -> read_groupid(GstkId, Option);
-	index         -> Idx;
-	itemtype      -> case GstkId#gstkid.widget_data of
-			     {Type, _, _, _} -> Type;
-			     {Type, _, _} -> Type;
-			     Type -> Type
-			 end;
-	enable        -> tcl2erl:ret_enable([PreCmd, " -st"]);
-	font -> gstk_db:opt(DB,GstkId,font,undefined);
-	label         -> tcl2erl:ret_label(["list [", PreCmd, " -lab] [",
-					    PreCmd, " -bit]"]);
-	selectbg      -> tcl2erl:ret_color([PreCmd, " -selectco"]);
-	underline     -> tcl2erl:ret_int([PreCmd, " -underl"]);
-	value         -> tcl2erl:ret_atom([PreCmd, " -val"]);
-	select        -> read_select(MenuW, Idx, GstkId);
-	click         -> gstk_db:is_inserted(DB, GstkId, click);
-	_ -> {bad_result, {GstkId#gstkid.objtype, invalid_option, Option}}
-    end.
-
-read_group(Gstkid, Option) ->
-    case Gstkid#gstkid.widget_data of
-	{_, G, _, _} -> G;
-	{_, G, _}    -> G;
-	_Other -> {bad_result,{Gstkid#gstkid.objtype, invalid_option, Option}}
-    end.
-
-read_groupid(Gstkid, Option) ->
-    case Gstkid#gstkid.widget_data of
-	{_, _, Gid, _} -> Gid;
-	{_, _, Gid}    -> Gid;
-	_Other -> {bad_result,{Gstkid#gstkid.objtype, invalid_option, Option}}
-    end.
-
-
+	accelerator -> tcl2erl:ret_str([PreCmd, " -acc"]);
+	activebg -> tcl2erl:ret_color([PreCmd, " -activeba"]);
+	activefg -> tcl2erl:ret_color([PreCmd, " -activefo"]);
+	bg -> tcl2erl:ret_color([PreCmd, " -backg"]);
+	fg -> tcl2erl:ret_color([PreCmd, " -foreg"]);
+	index -> Idx;
+	enable -> tcl2erl:ret_enable([PreCmd, " -st"]);
+	label -> tcl2erl:ret_label(["list [", PreCmd, " -lab] [", PreCmd, " -bit]"]);
+	selectbg -> tcl2erl:ret_color([PreCmd, " -selectco"]);
+	underline -> tcl2erl:ret_int([PreCmd, " -underl"]);
+	value -> tcl2erl:ret_atom([PreCmd, " -val"]);
+	select -> read_select(MenuW, Idx, GstkId);
+	_ -> read_option(Option, GstkId)
+    end;
+read_option(Option, GstkId, _DB) -> read_option(Option, GstkId).
 
+read_option(itemtype, #gstkid{widget_data = {Type, _, _, _}}) -> Type;
+read_option(itemtype, #gstkid{widget_data = {Type, _, _}}) -> Type;
+read_option(itemtype, #gstkid{widget_data = Type}) -> Type;
+read_option(group, GstkId) -> read_group(GstkId, group);
+read_option(groupid, GstkId) -> read_groupid(GstkId, groupid);
+read_option(Option, #gstkid{objtype = ObjType}) -> {bad_result, {ObjType, invalid_option, Option}}.
 
-read_select(TkMenu, Idx, Gstkid) ->
-    case Gstkid#gstkid.widget_data of
-	{radio, _, _, _} ->
-	    Cmd = ["list [set x [", TkMenu, " entrycg ", gstk:to_ascii(Idx),
-		   " -var];global $x;set $x] [", TkMenu,
-		   " entrycg ", gstk:to_ascii(Idx)," -val]"],
-	    case tcl2erl:ret_tuple(Cmd) of
-		{X, X} -> true;
-		_Other  -> false
-	    end;
-	{check, _, _} ->
-	    Cmd = ["set x [", TkMenu, " entrycg ", gstk:to_ascii(Idx),
-		   " -var];global $x;set $x"],
-	    tcl2erl:ret_bool(Cmd);
-	_Other ->
-	    {error,{invalid_option,menuitem,select}}
-    end.
+read_group(#gstkid{widget_data = {_, G, _, _}}, _Option) -> G;
+read_group(#gstkid{widget_data = {_, G, _}}, _Option) -> G;
+read_group(#gstkid{objtype = ObjType}, Option) -> {bad_result, {ObjType, invalid_option, Option}}.
 
+read_groupid(#gstkid{widget_data = {_, _, Gid, _}}, _Option) -> Gid;
+read_groupid(#gstkid{widget_data = {_, _, Gid}}, _Option) -> Gid;
+read_groupid(Gstkid, Option) -> read_group(Gstkid, Option).
 
+read_select(TkMenu, Idx, #gstkid{widget_data = {radio, _, _, _}}) ->
+    case tcl2erl:ret_tuple(["list [set x [", TkMenu, " entrycg ", gstk:to_ascii(Idx),
+			    " -var];global $x;set $x] [", TkMenu, " entrycg ", gstk:to_ascii(Idx), " -val]"]) of
+	{X, X} -> true;
+	_Other  -> false
+    end;
+read_select(TkMenu, Idx, #gstkid{widget_data = {check, _, _}}) ->
+    tcl2erl:ret_bool(["set x [", TkMenu, " entrycg ", gstk:to_ascii(Idx), " -var];global $x;set $x"]);
+read_select(_TkMenu, _Idx, _Gstkid) -> {error, {invalid_option, menuitem, select}}.
 
 %%-----------------------------------------------------------------------------
 %%			       PRIMITIVES
@@ -395,190 +323,131 @@ read_select(TkMenu, Idx, Gstkid) ->
 %% create version
 fix_group_and_value(Opts, DB, Owner) ->
     {G, GID, V, NOpts} = fgav(Opts, erlNIL, erlNIL, erlNIL, []),
-    RV = case V of
-	     erlNIL ->
-		 list_to_atom(lists:concat([v,gstk_db:counter(DB,value)]));
-	     Other0 -> Other0
+    RV = if
+	     V =:= erlNIL -> list_to_atom(lists:concat([v, gstk_db:counter(DB, value)]));
+	     true -> V
 	 end,
-    NG = case G of
-	       erlNIL -> mrb;
-	       Other1 -> Other1
-	   end,
-    RGID = case GID of
-	       erlNIL -> {mrbgrp, NG, Owner};
-	       Other2 -> Other2
+    NG = if
+	     G =:= erlNIL -> mrb;
+	     true -> G
+	 end,
+    RGID = if
+	       GID =:= erlNIL -> {mrbgrp, NG, Owner};
+	       true -> GID
 	   end,
-    RG = gstk_db:insert_bgrp(DB, RGID),
-    {NG, RGID, RV, [{group, RG}, {value, RV} | NOpts]}.
-    
+    {NG, RGID, RV, [{group, gstk_db:insert_bgrp(DB, RGID)}, {value, RV}|NOpts]}.
+
 %% config version
-fix_group_and_value(Opts, DB, Owner, Gstkid) ->
-    {Type, RG, RGID, RV} = Gstkid#gstkid.widget_data,
-    {G, GID, V, NOpts} = fgav(Opts, RG, RGID, RV, []),
-    case {G, GID, V} of
-	{RG, RGID, RV} ->
-	    {NOpts, Gstkid};
-	{NG, RGID, RV} ->
+fix_group_and_value(Opts, DB, Owner, #gstkid{widget_data = {Type, RG, RGID, RV}} = Gstkid) ->
+    case fgav(Opts, RG, RGID, RV, []) of
+	{RG, RGID, RV, NOpts} -> {NOpts, Gstkid};
+	{NG, RGID, RV, NOpts} ->
 	    NGID = {rbgrp, NG, Owner},
 	    gstk_db:delete_bgrp(DB, RGID),
-	    NRG = gstk_db:insert_bgrp(DB, NGID),
-	    NGstkid = Gstkid#gstkid{widget_data={Type,NG,NGID,RV}},
+	    NGstkid = Gstkid#gstkid{widget_data = {Type, NG, NGID, RV}},
 	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{group, NRG} | NOpts], NGstkid};
-	{RG, RGID, NRV} ->
-	    NGstkid = Gstkid#gstkid{widget_data={Type,RG,RGID,NRV}},
+	    {[{group, gstk_db:insert_bgrp(DB, NGID)}|NOpts], NGstkid};
+	{RG, RGID, NRV, NOpts} ->
+	    NGstkid = Gstkid#gstkid{widget_data = {Type, RG, RGID, NRV}},
 	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{value,NRV} | NOpts], NGstkid};
-	{_, NGID, RV} when NGID =/= RGID ->
+	    {[{value, NRV}|NOpts], NGstkid};
+	{_, NGID, RV, NOpts} ->
 	    gstk_db:delete_bgrp(DB, RGID),
-	    NRG = gstk_db:insert_bgrp(DB, NGID),
-	    NGstkid = Gstkid#gstkid{widget_data={Type,RG,NGID,RV}},
+	    NGstkid = Gstkid#gstkid{widget_data = {Type, RG, NGID, RV}},
 	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{group, NRG} | NOpts], NGstkid};
-	{_, NGID, NRV} when NGID =/= RGID ->
+	    {[{group, gstk_db:insert_bgrp(DB, NGID)}|NOpts], NGstkid};
+	{NG, RGID, NRV, NOpts} ->
+	    NGID = {rbgrp, NG, Owner},
 	    gstk_db:delete_bgrp(DB, RGID),
-	    NRG = gstk_db:insert_bgrp(DB, NGID),
-	    NGstkid = Gstkid#gstkid{widget_data={Type,RG,NGID,NRV}},
+	    NGstkid = Gstkid#gstkid{widget_data = {Type, NG, NGID, NRV}},
 	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{group, NRG}, {value,NRV} | NOpts], NGstkid};
-	{NG, RGID, NRV} ->
-	    NGID = {rbgrp, NG, Owner},
+	    {[{group, gstk_db:insert_bgrp(DB, NGID)}, {value, NRV}|NOpts], NGstkid};
+	{_, NGID, NRV, NOpts} ->
 	    gstk_db:delete_bgrp(DB, RGID),
-	    NRG = gstk_db:insert_bgrp(DB, NGID),
-	    NGstkid = Gstkid#gstkid{widget_data={Type,NG,NGID,NRV}},
+	    NGstkid = Gstkid#gstkid{widget_data = {Type, RG, NGID, NRV}},
 	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{group, NRG}, {value,NRV} | NOpts], NGstkid}
+	    {[{group, gstk_db:insert_bgrp(DB, NGID)}, {value, NRV}|NOpts], NGstkid}
     end.
 
-
-
-fgav([{group, G} | Opts], _, GID, V, Nopts) ->
-    fgav(Opts, G, GID, V, Nopts);
-
-fgav([{groupid, GID} | Opts], G, _, V, Nopts) ->
-    fgav(Opts, G, GID, V, Nopts);
-
-fgav([{value, V} | Opts], G, GID, _, Nopts) ->
-    fgav(Opts, G, GID, V, Nopts);
-
-fgav([Opt | Opts], G, GID, V, Nopts) ->
-    fgav(Opts, G, GID, V, [Opt | Nopts]);
-
-fgav([], Group, GID, Value, Opts) ->
-    {Group, GID, Value, Opts}.
-
+fgav([{group, G}|Opts], _, GID, V, Nopts) -> fgav(Opts, G, GID, V, Nopts);
+fgav([{groupid, GID}|Opts], G, _, V, Nopts) -> fgav(Opts, G, GID, V, Nopts);
+fgav([{value, V}|Opts], G, GID, _, Nopts) -> fgav(Opts, G, GID, V, Nopts);
+fgav([Opt|Opts], G, GID, V, Nopts) -> fgav(Opts, G, GID, V, [Opt|Nopts]);
+fgav([], Group, GID, Value, Opts) -> {Group, GID, Value, Opts}.
 
 %% check button version
 %% create version
 fix_group(Opts, DB, Owner) ->
     {G, GID, NOpts} = fg(Opts, erlNIL, erlNIL, []),
-    NG = case G of
-	       erlNIL ->
-		 Vref = gstk_db:counter(DB, variable),
-		 list_to_atom(lists:flatten(["mcb", gstk:to_ascii(Vref)]));
-	       Other1 -> Other1
-	   end,
-    RGID = case GID of
-	       erlNIL -> {mcbgrp, NG, Owner};
-	       Other2 -> Other2
+    NG = if
+	     G =:= erlNIL -> list_to_atom(lists:flatten(["mcb", gstk:to_ascii(gstk_db:counter(DB, variable))]));
+	     true -> G
+	 end,
+    RGID = if
+	       GID =:= erlNIL -> {mcbgrp, NG, Owner};
+	       true -> GID
 	   end,
-    RG = gstk_db:insert_bgrp(DB, RGID),
-    {NG, RGID, [{group, RG} | NOpts]}.
-    
+    {NG, RGID, [{group, gstk_db:insert_bgrp(DB, RGID)} | NOpts]}.
+
 %% config version
-fix_group(Opts, DB, Owner, Gstkid) ->
-    {Type, RG, RGID} = Gstkid#gstkid.widget_data,
-    {G, GID, NOpts} = fg(Opts, RG, RGID, []),
-    case {G, GID} of
-	{RG, RGID} ->
-	    {NOpts, Gstkid};
-	{NG, RGID} ->
+fix_group(Opts, DB, Owner, #gstkid{widget_data = {Type, RG, RGID}} = Gstkid) ->
+    case fg(Opts, RG, RGID, []) of
+	{RG, RGID, NOpts} -> {NOpts, Gstkid};
+	{NG, RGID, NOpts} ->
 	    NGID = {cbgrp, NG, Owner},
 	    gstk_db:delete_bgrp(DB, RGID),
-	    NRG = gstk_db:insert_bgrp(DB, NGID),
-	    NGstkid = Gstkid#gstkid{widget_data={Type,NG,NGID}},
+	    NGstkid = Gstkid#gstkid{widget_data = {Type, NG, NGID}},
 	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{group, NRG} | NOpts], NGstkid};
-	{_, NGID} when NGID =/= RGID ->
+	    {[{group, gstk_db:insert_bgrp(DB, NGID)}|NOpts], NGstkid};
+	{_, NGID, NOpts} ->
 	    gstk_db:delete_bgrp(DB, RGID),
-	    NRG = gstk_db:insert_bgrp(DB, NGID),
-	    NGstkid = Gstkid#gstkid{widget_data={Type,RG,NGID}},
+	    NGstkid = Gstkid#gstkid{widget_data = {Type, RG, NGID}},
 	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{group, NRG} | NOpts], NGstkid}
+	    {[{group, gstk_db:insert_bgrp(DB, NGID)}|NOpts], NGstkid}
     end.
 
+fg([{group, G}|Opts], _, GID, Nopts) -> fg(Opts, G, GID, Nopts);
+fg([{groupid, GID}|Opts], G, _, Nopts) -> fg(Opts, G, GID, Nopts);
+fg([Opt|Opts], G, GID, Nopts) -> fg(Opts, G, GID, [Opt|Nopts]);
+fg([], Group, GID, Opts) -> {Group, GID, Opts}.
 
+parse_opts(Opts, TkMenu) -> parse_opts(Opts, TkMenu, none, none, []).
 
-fg([{group, G} | Opts], _, GID, Nopts) ->
-    fg(Opts, G, GID, Nopts);
-
-fg([{groupid, GID} | Opts], G, _, Nopts) ->
-    fg(Opts, G, GID, Nopts);
-
-fg([Opt | Opts], G, GID, Nopts) ->
-    fg(Opts, G, GID, [Opt | Nopts]);
-
-fg([], Group, GID, Opts) ->
-    {Group, GID, Opts}.
-
-
-
-parse_opts(Opts, TkMenu) ->
-    parse_opts(Opts, TkMenu, none, none, []).
-
-
-parse_opts([Option | Rest], TkMenu, Idx, Type, Options) ->
+parse_opts([Option|Rest], TkMenu, Idx, Type, Options) ->
     case Option of
-	{index,    I} -> parse_opts(Rest, TkMenu, I, Type, Options);
+	{index, I} -> parse_opts(Rest, TkMenu, I, Type, Options);
 	{itemtype, T} -> parse_opts(Rest, TkMenu, Idx, T, Options);
-	_Other         -> parse_opts(Rest, TkMenu, Idx, Type,[Option | Options])
+	_Other -> parse_opts(Rest, TkMenu, Idx, Type, [Option|Options])
     end;
 parse_opts([], TkMenu, Index, Type, Options) ->
-    RealIdx =
-	case Index of
-	    Idx when is_integer(Idx) -> Idx;
-	    last  -> find_last_index(TkMenu);
-	    Other -> gs:error("Invalid index ~p~n",[Other])
-	end,
-    {RealIdx, Type, Options}.
+    {case Index of
+	 Idx when is_integer(Idx) -> Idx;
+	 last -> find_last_index(TkMenu);
+	 Other -> gs:error("Invalid index ~p~n", [Other])
+     end, Type, Options}.
 
 find_last_index(TkMenu) ->
     case tcl2erl:ret_int([TkMenu, " index last"]) of
-	Last when is_integer(Last) -> Last+1;
-	none  -> 0;
-	Other -> gs:error("Couldn't find index ~p~n",[Other])
+	Last when is_integer(Last) -> Last + 1;
+	none -> 0;
+	Other -> gs:error("Couldn't find index ~p~n", [Other])
     end.
 
 cbind({true, Edata}, Gstkid, TkMenu, Index, Type, DB) ->
     Eref = gstk_db:insert_event(DB, Gstkid, click, Edata),
     IdxStr = gstk:to_ascii(Index),
-    case Type of
-	normal ->
-	    Cmd = [" -command {erlsend ", Eref,
-		   " \\\"[",TkMenu," entrycg ",IdxStr," -label]\\\" ",
-		   IdxStr,"}"],
-	    {s, Cmd};
-	check ->
-	    Cmd = [" -command {erlsend ", Eref,
-		   " \[expr \$[", TkMenu, " entrycg ",IdxStr," -var]\] \\\"[",
-		   TkMenu, " entrycg ",IdxStr," -label]\\\" ",IdxStr,"}"],
-	    {s, Cmd};
-	radio ->
-	    Cmd = [" -command {erlsend ", Eref,
-		   " [", TkMenu, " entrycg ",IdxStr," -var] \\\"[",
-		   TkMenu, " entrycg ",IdxStr," -label]\\\" ",IdxStr,"}"],
-	    {s, Cmd};
-	_Other ->
-	    none
+    if
+	Type =:= normal -> {s, [" -command {erlsend ", Eref, " \\\"[", TkMenu, " entrycg ", IdxStr,
+				" -label]\\\" ", IdxStr, "}"]};
+	Type =:= check -> {s, [" -command {erlsend ", Eref, " \[expr \$[", TkMenu, " entrycg ", IdxStr,
+			       " -var]\] \\\"[", TkMenu, " entrycg ", IdxStr, " -label]\\\" ", IdxStr, "}"]};
+	Type =:= radio -> {s, [" -command {erlsend ", Eref, " [", TkMenu, " entrycg ", IdxStr,
+			       " -var] \\\"[", TkMenu, " entrycg ", IdxStr, " -label]\\\" ", IdxStr, "}"]};
+	true -> none
     end;
-
 cbind({false, _}, Gstkid, _TkMenu, _Index, _Type, DB) ->
     gstk_db:delete_event(DB, Gstkid, click),
     none;
-
-cbind(On, Gstkid, TkMenu, Index, Type, DB) when is_atom(On) ->
-    cbind({On, []}, Gstkid, TkMenu, Index, Type, DB).
-
+cbind(On, Gstkid, TkMenu, Index, Type, DB) when is_atom(On) -> cbind({On, []}, Gstkid, TkMenu, Index, Type, DB).
 
 %%% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_oval.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_oval.erl
--- otp_src_19.0.5/lib/gs/src/gstk_oval.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_oval.erl	2016-08-25 16:37:44.566693320 +0300
@@ -30,7 +30,7 @@
 %%
 %%  Options:
 %%	bw			Int
-%%	coords			[{X1,Y1}, {X2,Y2}]
+%%	coords			[{X1, Y1}, {X2, Y2}]
 %%	data			Data
 %%	fg			Color
 %%	fill			Color
@@ -61,8 +61,7 @@
 %%  Not Implemented:
 %%
 
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
-	 option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -74,26 +73,19 @@
 %% Purpose    	: Create a widget of the type defined in this module.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, Gstkid, Opts) ->
-    case gstk_canvas:pickout_coords(Opts, [],oval,2) of
-	{error, Error} ->
-	    {bad_result, Error};
+    case gstk_canvas:pickout_coords(Opts, [], oval, 2) of
+	{error, Error} -> {bad_result, Error};
 	{Coords, NewOpts} ->
-	    Ngstkid=gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
-	    #gstkid{widget=CanvasTkW}=Ngstkid,
-	    MCmd = [CanvasTkW, " create ov ", Coords],
-	    gstk_canvas:mk_cmd_and_call(NewOpts,Ngstkid, CanvasTkW, MCmd, DB)
+	    #gstkid{widget = CanvasTkW} = Ngstkid = gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
+	    gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create ov ", Coords], DB)
     end.
 
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
 %% Purpose    	: Configure a widget of the type defined in this module.
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    gstk_canvas:item_config(DB, Gstkid, Opts).
-
-
+config(DB, Gstkid, Opts) -> gstk_canvas:item_config(DB, Gstkid, Opts).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -104,9 +96,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    Item = Gstkid#gstkid.widget_data,
-    gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
+read(DB, #gstkid{widget_data = Item} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -116,8 +106,7 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy | {Parent, Objmod, Args}.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
-    gstk_canvas:item_delete_impl(DB,Gstkid).
+delete(DB, Gstkid) -> gstk_canvas:item_delete_impl(DB, Gstkid).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: destroy/3
@@ -128,9 +117,7 @@ delete(DB, Gstkid) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
-    gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: event/5
@@ -143,9 +130,7 @@ destroy(_DB, Canvas, Item) ->
 %%		
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
-
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%-----------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -158,13 +143,13 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%		  MainW   - The main tk-widget
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, _Gstkid, _Canvas, _DB, _AItem) ->
-    case Option of
-	{fg,          Color} -> {s, [" -outline ", gstk:to_color(Color)]};
-	{bw,            Int} -> {s, [" -w ", gstk:to_ascii(Int)]};
-	_ -> invalid_option
-    end.
+option(Option, _Gstkid, _Canvas, _DB, _AItem) -> option(Option).
+
+option({fg, Color}) -> option_s(" -outline ", gstk:to_color(Color));
+option({bw, Int}) -> option_s(" -w ", gstk:to_ascii(Int));
+option(_Option) -> invalid_option.
 
+option_s(Str, Val) -> {s, [Str, Val]}.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
@@ -175,15 +160,17 @@ option(Option, _Gstkid, _Canvas, _DB, _A
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option, Gstkid, Canvas, _DB, AItem) ->
-    case Option of
-	bw       -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
-	fg       -> tcl2erl:ret_color([Canvas, " itemcg ", AItem," -outline"]);
-	stipple  -> tcl2erl:ret_stipple([Canvas," itemcg ",AItem," -stipple"]);
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
-    end.
+read_option(Option, Gstkid, Canvas, _DB, AItem) -> read_option(Option, Gstkid, Canvas, AItem).
 
+read_option(Option, Gstkid, Canvas, AItem) ->
+    case read_option(Option, AItem, Canvas) of
+	invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+	O -> O
+    end.
 
+read_option(bw, AItem, Canvas) -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
+read_option(fg, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -outline"]);
+read_option(stipple, AItem, Canvas) -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -stipple"]);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
 
 %% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_polygon.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_polygon.erl
--- otp_src_19.0.5/lib/gs/src/gstk_polygon.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_polygon.erl	2016-08-25 16:37:44.566693320 +0300
@@ -25,13 +25,12 @@
 
 -module(gstk_polygon).
 
-
 %%-----------------------------------------------------------------------------
-%% 			    POLYGON OPTIONS
+%%			    POLYGON OPTIONS
 %%
 %%  Attributes:
 %%	bw			Int
-%%	coords			[{X1,Y1}, {X2,Y2} | {Xn,Yn}]
+%%	coords			[{X1, Y1}, {X2, Y2} | {Xn, Yn}]
 %%	data			Data
 %%	fg			Color
 %%	fill			Color
@@ -62,8 +61,7 @@
 %%	type
 %%
 
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
-	 option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -76,23 +74,18 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, Gstkid, Opts) ->
     case pickout_coords(Opts, []) of
-	{error, Error} ->
-	    {bad_result, Error};
+	{error, Error} -> {bad_result, Error};
 	{Coords, NewOpts} ->
-	    Ngstkid=gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
-	    #gstkid{widget=CanvasTkW}=Ngstkid,
-	    MCmd = [CanvasTkW, " create po ", Coords],
-	    gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid,CanvasTkW, MCmd, DB)
+	    #gstkid{widget = CanvasTkW} = Ngstkid = gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
+	    gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create po ", Coords], DB)
     end.
 
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
 %% Purpose    	: Configure a widget of the type defined in this module.
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    gstk_canvas:item_config(DB, Gstkid, Opts).
+config(DB, Gstkid, Opts) -> gstk_canvas:item_config(DB, Gstkid, Opts).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -103,9 +96,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    Item = Gstkid#gstkid.widget_data,
-    gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
+read(DB, #gstkid{widget_data = Item} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -115,8 +106,7 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy | {Parent, Objmod, Args}.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
-    gstk_canvas:item_delete_impl(DB,Gstkid).
+delete(DB, Gstkid) -> gstk_canvas:item_delete_impl(DB, Gstkid).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: destroy/3
@@ -127,12 +117,9 @@ delete(DB, Gstkid) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
-    gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
 
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%-----------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -148,15 +135,17 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, _Gstkid, _Canvas, _DB, _AItem) ->
-    case Option of
-	{fg,          Color} -> {s, [" -outline ", gstk:to_color(Color)]};
-	{bw,            Int} -> {s, [" -w ", gstk:to_ascii(Int)]};
-	{smooth,       Bool} -> {s, [" -sm ", gstk:to_ascii(Bool)]};
-	{splinesteps,   Int} -> {s, [" -sp ", gstk:to_ascii(Int)]};
-	_ -> invalid_option
-    end.
+option(Option, _Gstkid, _Canvas, _DB, _AItem) -> option(Option).
+
+option({fg, Color}) -> option_s([" -outline ", gstk:to_color(Color)]);
+option({bw, Int}) -> to_ascii(" -w ", Int);
+option({smooth, Bool}) -> to_ascii(" -sm ", Bool);
+option({splinesteps, Int}) -> to_ascii(" -sp ", Int);
+option(_Option) -> invalid_option.
+
+option_s(L) -> {s, L}.
 
+to_ascii(Str, Val) -> option_s([Str, gstk:to_ascii(Val)]).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
@@ -164,33 +153,32 @@ option(Option, _Gstkid, _Canvas, _DB, _A
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option, Gstkid, Canvas, _DB, AItem) ->
-    case Option of
-	bw            -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
-	fg            ->
-	    tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -outline"]);
-	smooth        -> tcl2erl:ret_bool([Canvas, " itemcg ", AItem, " -sm"]);
-	splinesteps   -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -sp"]);
-	stipple       ->
-	    tcl2erl:ret_stipple([Canvas," itemcg ",AItem," -stipple"]);
+read_option(Option, Gstkid, Canvas, _DB, AItem) -> read_option(Option, Gstkid, Canvas, AItem).
 
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(Option, Gstkid, Canvas, AItem) ->
+    case read_option(Option, AItem, Canvas) of
+	invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+	O -> O
     end.
 
+read_option(bw, AItem, Canvas) -> ret_int(" -w", AItem, Canvas);
+read_option(fg, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -outline"]);
+read_option(smooth, AItem, Canvas) -> tcl2erl:ret_bool([Canvas, " itemcg ", AItem, " -sm"]);
+read_option(splinesteps, AItem, Canvas) -> ret_int(" -sp", AItem, Canvas);
+read_option(stipple, AItem, Canvas) -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -stipple"]);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
+
+ret_int(Str, AItem, Canvas) -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, Str]).
+
 %%-----------------------------------------------------------------------------
 %%			       PRIMITIVES
 %%-----------------------------------------------------------------------------
 
-pickout_coords([{coords,Coords} | Rest], Opts) when length(Coords) >= 2 ->
+pickout_coords([], _Opts) -> {error, "A polygon must have at least four coordinates"};
+pickout_coords([{coords, [_,_|_] = Coords}|Rest], Opts) ->
     case gstk_canvas:coords(Coords) of
-	invalid ->
-	    {error, "A polygon must have at least four coordinates"};
-	RealCoords ->
-	    {RealCoords, lists:append(Rest, Opts)}
+	invalid -> pickout_coords([], Opts);
+	RealCoords -> {RealCoords, lists:append(Rest, Opts)}
     end;
-pickout_coords([Opt | Rest], Opts) ->
-    pickout_coords(Rest, [Opt|Opts]);
-pickout_coords([], _Opts) ->
-    {error, "A polygon must have at least four coordinates"}.
+pickout_coords([Opt|Rest], Opts) -> pickout_coords(Rest, [Opt|Opts]).
 %% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_port_handler.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_port_handler.erl
--- otp_src_19.0.5/lib/gs/src/gstk_port_handler.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_port_handler.erl	2016-08-25 16:37:44.566693320 +0300
@@ -35,7 +35,8 @@
 %% ------------------------------------------------------------
 
 -module(gstk_port_handler).
--compile([{nowarn_deprecated_function,{gs,error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, error, 2}}]).
 
 -include("gstk.hrl").
 
@@ -44,59 +45,19 @@
 % FIXME There has to be a better solution....
 % FIXME Add option in app file or environmen  variable.
 
--define(WISHNAMES, ["wish85","wish8.5",
-		    "wish84","wish8.4",
-		    "wish83","wish8.3",
-		    "wish82","wish8.2",
-		    "wish"]).
+-define(WISHNAMES, ["wish85", "wish8.5", "wish84", "wish8.4", "wish83", "wish8.3", "wish82", "wish8.2", "wish"]).
 
 %% ------------------------------------------------------------
 %%                  DEBUG FUNCTIONS 
 %% ------------------------------------------------------------
--export([exec/1,call/2,
-	 start_link/1,init/2,ping/1,stop/1]).
+-export([exec/1, call/2, start_link/1, init/2, ping/1, stop/1]).
 -export([wait_for_connection/2]).
 
--define(START_TIMEOUT , 1000 * 30).
+-define(START_TIMEOUT, 1000 * 30).
 -define(ACCEPT_TIMEOUT, 1000 * 20).
 
 -define(DEBUGLEVEL, 4).
 
--ifdef(DEBUG).
-
--define(DBG(DbgLvl,Format, Data),dbg(DbgLvl, Format, Data)).
--define(DBG_STR(DbgLvl, What, Str),dbg_str(DbgLvl, What, Str)).
-
-dbg(DbgLvl, Format, Data) when DbgLvl =< ?DEBUGLEVEL ->
-    ok = io:format("DBG: " ++ Format, Data);
-dbg(_DbgLvl, _Format, _Data) -> ok.
-
-dbg_str(DbgLvl, What, Str) when DbgLvl =< ?DEBUGLEVEL ->
-    ok = io:format("DBG: ~s~s\n", [What,dbg_s(Str)]);
-dbg_str(_DbgLvl, _What, _Data) -> ok.
-
-dbg_s([]) ->
-    [];
-dbg_s([C | Str]) when list(C) ->
-    [dbg_s(C) | dbg_s(Str)];
-dbg_s([C | Str]) when C >= 20, C < 255 ->
-    [C | dbg_s(Str)];
-dbg_s([$\n | Str]) ->
-    ["\\n" | dbg_s(Str)];
-dbg_s([$\r | Str]) ->
-    ["\\r" | dbg_s(Str)];
-dbg_s([$\t | Str]) ->
-    ["\\t" | dbg_s(Str)];
-dbg_s([C | Str]) when integer(C) ->
-    [io_lib:format("\\~.3.0w",[C]) | dbg_s(Str)].
-
--else.
-
--define(DBG(DbgLvl,Format, Data), true).
--define(DBG_STR(DbgLvl, What, Str), true).
-
--endif.
-
 %% ------------------------------------------------------------
 %%                  INTERFACE FUNCTIONS 
 %% ------------------------------------------------------------
@@ -113,82 +74,56 @@ dbg_s([C | Str]) when integer(C) ->
 
 get_env(App, KeyAtom) ->
     KeyStr = atom_to_list(KeyAtom),
-    ?DBG(1,"Result from init:get_argument(~w): ~p\n",
-	[KeyAtom,init:get_argument(App)]),
     case init:get_argument(App) of
-	{ok,[[KeyStr,ValStr]]} ->
-	    {ok,list_to_atom(ValStr)};
-	_ ->
-	    undefined
+	{ok, [[KeyStr, ValStr]]} -> {ok, list_to_atom(ValStr)};
+	_ -> undefined
     end.
 
 start_link(Gstk) ->
-    ?DBG(1, "start_link(~w)~n", [Gstk]),
-%    io:format("STARTS ~p\n",[erlang:localtime()]),
-    Mode = 
-	% FIXME: Want to use application:get_env() if we where an true app
-	case {os:type(),get_env(gs,backend_comm)} of
-	    {{win32,_Flavor},undefined} ->
-		use_socket;
-	    {_OS,undefined} ->
-		use_port;
-	    {_OS,{ok,socket}} ->
-		use_socket;
-	    {_OS,{ok,port}} ->
-		use_port
-	end,
-    ?DBG(1,"We use mode: ~w (~w)\n",[Mode,get_env(gs,backend_comm)]),
-    Pid = spawn_link(gstk_port_handler, init, [Gstk,Mode]),
+    Pid = spawn_link(gstk_port_handler, init, [Gstk, case {os:type(), get_env(gs, backend_comm)} of
+							 {{win32, _Flavor}, undefined} -> use_socket;
+							 {_OS, undefined} -> use_port;
+							 {_OS, {ok, socket}} -> use_socket;
+							 {_OS, {ok, port}} -> use_port
+						     end]),
     receive
-	{Pid, ok} ->
-	    {ok, Pid};
-	{Pid, error, Reason} ->
-	    {error, Reason}
-    after ?START_TIMEOUT ->
-	    {error, timeout}
+	{Pid, ok} -> {ok, Pid};
+	{Pid, error, Reason} -> {error, Reason}
+    after ?START_TIMEOUT -> {error, timeout}
     end.
 
 call(PortHandler, Cmd) ->
-    PortHandler ! {call, ["erlcall {",Cmd,$}]},
+    PortHandler ! {call, ["erlcall {", Cmd, $}]},
     receive
-        {result, Result}         -> 
-            ?DBG(1, "call reply: ~p~n", [Result]),
-            {result,     Result};
-        {bad_result, Bad_Result} ->
-            ?DBG(1, "bad call reply: ~p~n", [Bad_Result]),
-            {bad_result, Bad_Result}
+	{result, _Result} = R -> R;
+	{bad_result, _Bad_Result} = R -> R
     end.
 
 ping(PortHandler) ->
-    ?DBG(1, "ping~n", []),
     PortHandler ! {ping, self()},
     receive
-	{pong,_From,PortOrSock} -> {ok,PortOrSock}
+	{pong, _From, PortOrSock} -> {ok, PortOrSock}
     end.
 
 stop(PortHandler) ->
-    ?DBG(1, "stop~n", []),
-    PortHandler ! {stop,self()},
+    PortHandler ! {stop, self()},
     receive
-	{stopped,PortHandler} -> ok
+	{stopped, PortHandler} -> ok
     end.
 
 %% Purpose: asyncron call to tk 
 %% too expensive 
-% FIXME   
+% FIXME
 exec(Cmd) ->
-    get(port_handler) ! {exec, ["erlexec {",Cmd,$}]},
+    get(port_handler) ! {exec, ["erlexec {", Cmd, $}]},
     ok.
 
 % in gstk context, but I don't want "ifndef nt40" in other 
 % modules than this one.
 %exec(Cmd) ->
-%    ?DBG_STR(1, "", ["erlexec {",Cmd,"}"]),
 %    case get(port) of
-%	{socket,Sock} ->
-%	    gen_tcp:send(Sock, ["erlexec {",Cmd,$}]);
-%	{port,Port} ->
-%	    Port ! {get(port_handler),{command,["erlexec {",Cmd,$}]}}
+%	{socket, Sock} -> gen_tcp:send(Sock, ["erlexec {", Cmd, $}]);
+%	{port,  Port} -> Port ! {get(port_handler), {command, ["erlexec {", Cmd, $}]}}
 %    end,
 %    ok.
 
@@ -203,134 +138,79 @@ exec(Cmd) ->
 %% gstk: is the pid of the gstk process that started me. 
 %%      all my input (from the port) is forwarded to it.
 %%----------------------------------------------------------------------
--record(state,{out,gstk}).
+-record(state, {out, gstk}).
 
 init(Gstk, Mode) ->
-    process_flag(trap_exit,true),
-
+    process_flag(trap_exit, true),
     % ------------------------------------------------------------
     % Set up paths
     % ------------------------------------------------------------
-
     PrivDir = code:priv_dir(gs),
-    TclDir = filename:join(PrivDir,"tcl"),
-    TclBinDir = filename:join(TclDir,"bin"),
-    TclLibDir = filename:join(TclDir,"lib"),
-
-    InitScript = filename:nativename(filename:join(PrivDir,"gstk.tcl")),
-
-    ?DBG(1, "TclBinDir  : ~s\n", [TclBinDir]),
-    ?DBG(1, "TclLibDir  : ~s\n", [TclLibDir]),
-    ?DBG(1, "InitScript : ~s\n", [InitScript]),
-
+    TclDir = filename:join(PrivDir, "tcl"),
+    InitScript = filename:nativename(filename:join(PrivDir, "gstk.tcl")),
     % ------------------------------------------------------------
     % Search for wish in priv and in system search path
     % ------------------------------------------------------------
-
-    {Wish,Options} = 
-	case filelib:wildcard(filename:join(TclBinDir,"wish*")) of
-	    % If more than one wish in priv we assume they are the same
-	    [PrivWish | _] ->
-		% ------------------------------------------------
-		% We have to set TCL_LIBRARY and TK_LIBRARY because else
-		% 'wish' will search in the original installation directory
-		% for 'tclIndex' and this may be an incompatible version on
-		% the host we run on.
-		% ------------------------------------------------
-
-		[TclLibrary] =
-		    filelib:wildcard(filename:join(PrivDir,
-						   "tcl/lib/tcl[1-9]*")),
-		[TkLibrary]  =
-		    filelib:wildcard(filename:join(PrivDir,
-						   "tcl/lib/tk[1-9]*")),
-
-		Opts = [{env,[{"TCL_LIBRARY", TclLibrary},
-			      {"TK_LIBRARY", TkLibrary},
-			      {"LD_LIBRARY_PATH",TclLibDir}]},
-		       {packet,4}],
-		{PrivWish,Opts};
-	    _ ->
-		% We use the system wish program
-		{search_wish(?WISHNAMES, Gstk),[{packet,4}]}
-	end,
-
-
-    ?DBG(1, "Wish       : ~s\n", [Wish]),
-
-    Cmd =
-	case Mode of
-	    use_socket ->
-		% ------------------------------------------------------------
-		% Set up a listening socket and call accept in another process
-		% ------------------------------------------------------------
-		SocketOpts =
-		    [
-		     {nodelay, true},
-		     {packet,4},
-		     {reuseaddr,true}
-		    ],
-		% Let OS pick a number
-		{ok,ListenSocket} = gen_tcp:listen(0, SocketOpts),
-		{ok,ListenPort} = inet:port(ListenSocket),
-
-		% Wait in another process
-		spawn_link(?MODULE,wait_for_connection,[self(),ListenSocket]),
-		lists:concat([Wish," ",InitScript," -- ",PrivDir," ",
-			      ListenPort]);
-	    use_port ->
-		lists:concat([Wish," ",InitScript," -- ",PrivDir])
-	end,
-
-    ?DBG(1, "Port opts  :\n~p\n", [Options]),
-
-    % FIXME remove timing if not debugging
-    Port =
-	case timer:tc(erlang,open_port,[{spawn, Cmd}, Options]) of
-	    {_T,Port1} when is_port(Port1) ->
-		?DBG(1,"open_port takes ~p milliseconds\n",[_T/1000]),
-		link(Port1),
-		Port1;
-	    {_T,{error,_Reason1}} ->		% FIXME: Why throw away reason?!
-		?DBG(1,"ERROR: ~p\n",[_Reason1]),
-		Gstk ! {self(), error, backend_died},
-		exit(normal)
-	end,
-
-    State =
-	case Mode of
-	    use_socket ->
-		% ------------------------------------------------------------
-		% Wait for a connection
-		% ------------------------------------------------------------
-		Sock =
-		    receive
-			{connected,Socket} ->
-			    Socket;
-			% FIXME: Why throw away reason?!
-			{'EXIT', _Pid, _Reason2} ->
-			    Gstk ! {self(), error, backend_died},
-			    exit(normal)
-		    end,
-
-		?DBG(1,"Got socket ~p~n",[Sock]),
-		#state{out={socket,Sock}, gstk=Gstk};
-	    use_port ->
-		#state{out={port,Port}, gstk=Gstk}
-	end,
-
-    Gstk ! {self(), ok},			% Tell caller we are prepared
-    idle(State).
+    {Wish, Options} = case filelib:wildcard(filename:join(filename:join(TclDir, "bin"), "wish*")) of
+			  % If more than one wish in priv we assume they are the same
+			  [PrivWish|_] ->
+			  % ------------------------------------------------
+			  % We have to set TCL_LIBRARY and TK_LIBRARY because else
+			  % 'wish' will search in the original installation directory
+			  % for 'tclIndex' and this may be an incompatible version on
+			  % the host we run on.
+			  % ------------------------------------------------
+			  [TclLibrary] = filelib:wildcard(filename:join(PrivDir, "tcl/lib/tcl[1-9]*")),
+			  [TkLibrary] = filelib:wildcard(filename:join(PrivDir, "tcl/lib/tk[1-9]*")),
+			  {PrivWish, [{env, [{"TCL_LIBRARY", TclLibrary},
+					     {"TK_LIBRARY", TkLibrary},
+					     {"LD_LIBRARY_PATH", filename:join(TclDir, "lib")}]},
+				      {packet, 4}]};
+			  % We use the system wish program
+			  _ -> {search_wish(?WISHNAMES, Gstk), [{packet, 4}]}
+		      end,
+    Out = if
+	      Mode =:= use_socket ->
+		  % ------------------------------------------------------------
+		  % Set up a listening socket and call accept in another process
+		  % ------------------------------------------------------------
+		  % Let OS pick a number
+		  {ok, ListenSocket} = gen_tcp:listen(0, [{nodelay, true}, {packet, 4}, {reuseaddr, true}]),
+		  %{ok, ListenPort} = inet:port(ListenSocket),
+		  % Wait in another process
+		  spawn_link(?MODULE, wait_for_connection, [self(), ListenSocket]),
+		  %Cmd = lists:concat([Wish, " ", InitScript, " -- ", PrivDir, " ", ListenPort]),
+		  % ------------------------------------------------------------
+		  % Wait for a connection
+		  % ------------------------------------------------------------
+		  {socket, receive
+			       {connected, Socket} -> Socket;
+			       % FIXME: Why throw away reason?!
+			       {'EXIT', _Pid, _Reason2} ->
+				   Gstk ! {self(), error, backend_died},
+				   exit(normal)
+			   end};
+	      Mode =:= use_port ->
+		  % FIXME remove timing if not debugging
+		  {port, case timer:tc(erlang, open_port, [{spawn, lists:concat([Wish, " ", InitScript, " -- ", PrivDir])}, Options]) of
+			     {_T, Port} when is_port(Port) ->
+				 link(Port),
+				 Port;
+			     {_T, {error, _Reason1}} -> % FIXME: Why throw away reason?!
+				 Gstk ! {self(), error, backend_died},
+				 exit(normal)
+			 end}
+	  end,
+    Gstk ! {self(), ok}, % Tell caller we are prepared
+    idle(#state{out = Out, gstk = Gstk}).
 
 search_wish([], Gstk) ->
     Gstk ! {self(), error, backend_died},
     exit(normal);
-search_wish([WishName | WishNames], Gstk) ->
+search_wish([WishName|WishNames], Gstk) ->
     case os:find_executable(WishName) of
-	false ->
-	    search_wish(WishNames, Gstk);
-	Wish ->
-	    Wish
+	false -> search_wish(WishNames, Gstk);
+	Wish -> Wish
     end.
 	
 %%----------------------------------------------------------------------
@@ -338,59 +218,36 @@ search_wish([WishName | WishNames], Gstk
 %%----------------------------------------------------------------------
 
 wait_for_connection(CallerPid, ListenSocket) ->
-    {ok,Sock} = gen_tcp:accept(ListenSocket, ?ACCEPT_TIMEOUT),
-    ?DBG(1,"Got accept ~p~p~n",[self(),Sock]),
-    ok = gen_tcp:controlling_process(Sock,CallerPid),
-    CallerPid ! {connected,Sock}.
+    {ok, Sock} = gen_tcp:accept(ListenSocket, ?ACCEPT_TIMEOUT),
+    ok = gen_tcp:controlling_process(Sock, CallerPid),
+    CallerPid ! {connected, Sock}.
 
 %% ===========================================================================
 %% The main loop
 %% ===========================================================================
 
 idle(State) ->
-    ?DBG(1, "idle~n", []),
-%    io:format("IDLE ~p\n",[erlang:localtime()]),
     receive
-
 	{call, Cmd} ->
 	    output(State, Cmd),
 	    idle(State);
-
 	{exec, Cmd} ->
 	    collect_exec_calls(Cmd, [], 0, State),
 	    idle(State);
-
 	{_Port, {data, Input}} ->
-	    ?DBG_STR(2, "INPUT[port]: ", [Input]),
 	    handle_input(State, Input),
 	    idle(State);
-
 	{tcp, _Sock, Input} ->
-	    ?DBG_STR(2, "INPUT[sock]: ", [Input]),
 	    handle_input(State, Input),
 	    idle(State);
-
-	{ping,From} ->
-	    From ! {pong,self(),State#state.out},
-	    idle(State);
-
-	{stop,From} ->
-	    From ! {stopped,self()};
-
-	% FIXME: We are we not to terminate if watforsocket
-	% terminated but what about the port???????
-	{'EXIT',_Pid,normal} ->
-	    ?DBG(1, "EXIT[~w]: normal~n", [_Pid]),
+	{ping, From} ->
+	    From ! {pong, self(), State#state.out},
 	    idle(State);
-
-	{'EXIT',Pid,Reason} ->
-	    %%io:format("Port died when in idle loop!~n"),
-	    ?DBG(1,"EXIT[~w]~n~p~n",[Pid,Reason]),
-	    exit({port_handler,Pid,Reason});
-
+	{stop, From} -> From ! {stopped, self()};
+	{'EXIT', _Pid, normal} -> idle(State);
+	{'EXIT', Pid, Reason} -> exit({port_handler, Pid, Reason});
 	Other ->
-	    ?DBG(1,"OTHER: ~p~n",[Other]),
-	    gs:error("gstk_port_handler: got other: ~w~n",[Other]),
+	    gs:error("gstk_port_handler: got other: ~w~n", [Other]),
 	    idle(State)
     end.
 
@@ -400,27 +257,17 @@ idle(State) ->
 
 collect_exec_calls(Cmd, Queue, QueueLen, State) when QueueLen < ?MAXQUEUE ->
     receive
-	{exec, NewCmd} ->
-%	    io:format("collect~p~n", [NewCmd]),
-	    collect_exec_calls(NewCmd, [Cmd | Queue], QueueLen+1, State)
-    after 0 ->
-	    if
-		QueueLen == 0 ->
-		    output(State, Cmd);
-		true ->
-		    output(State, join_cmd_reverse(Cmd, Queue, []))
-	    end
+	{exec, NewCmd} -> collect_exec_calls(NewCmd, [Cmd|Queue], QueueLen + 1, State)
+    after 0 -> output(State, if
+				 QueueLen =:= 0 -> Cmd;
+				 true -> join_cmd_reverse(Cmd, Queue, [])
+			     end)
     end;
-collect_exec_calls(Cmd, Queue, _QueueLen, State) -> % Queue is full, output
-    String = join_cmd_reverse(Cmd, Queue, []),
-%    io:format("queue full: ~p~n", [String]),
-    output(State, String).
-
+% Queue is full, output
+collect_exec_calls(Cmd, Queue, _QueueLen, State) -> output(State, join_cmd_reverse(Cmd, Queue, [])).
 
-join_cmd_reverse(Cmd, [], DeepStr) ->
-    [DeepStr | Cmd];
-join_cmd_reverse(Cmd, [Cmd1 | Cmds], DeepStr) ->
-    join_cmd_reverse(Cmd, Cmds, [Cmd1,$; | DeepStr]).
+join_cmd_reverse(Cmd, [], DeepStr) -> [DeepStr|Cmd];
+join_cmd_reverse(Cmd, [Cmd1|Cmds], DeepStr) -> join_cmd_reverse(Cmd, Cmds, [Cmd1, $;|DeepStr]).
 
 %% ----------------------------------------------------------------------
 %%
@@ -430,38 +277,21 @@ join_cmd_reverse(Cmd, [Cmd1 | Cmds], Dee
 %% 3 - Bad reply from call
 %% 4 - Error
 %% 5 - End of message
-%% 
-
-handle_input(State,[Type | Data]) ->
-    GstkPid = State#state.gstk,
-    case Type of
-	1 ->
-	    handle_event(GstkPid,Data);
-
-	2 ->
-	    GstkPid ! {result, Data};
-
-	3 ->
-	    GstkPid ! {bad_result, Data};
+%%
 
-	4 ->
-	    gs:error("gstk_port_handler: error in input : ~s~n",[Data])
-    end.
+handle_input(#state{gstk = GstkPid}, [1|Data]) -> handle_event(GstkPid, Data);
+handle_input(#state{gstk = GstkPid}, [2|Data]) -> GstkPid ! {result, Data};
+handle_input(#state{gstk = GstkPid}, [3|Data]) -> GstkPid ! {bad_result, Data};
+handle_input(_State, [4|Data]) -> gs:error("gstk_port_handler: error in input : ~s~n", [Data]).
 
 %% ----------------------------------------------------------------------
 %% output a command to the port
 %% buffer several incoming execs
 %%
-output(#state{out = {socket,Sock}}, Cmd) ->
-    ?DBG_STR(1, "OUTPUT[sock]: ", [Cmd]),
-    ok = gen_tcp:send(Sock, Cmd);
+output(#state{out = {socket, Sock}}, Cmd) -> ok = gen_tcp:send(Sock, Cmd);
 
-output(#state{out = {port,Port}}, Cmd) ->
-    ?DBG_STR(1, "OUTPUT[port]: ", [Cmd]),
-    Port ! {self(), {command, Cmd}}.
+output(#state{out = {port, Port}}, Cmd) -> Port ! {self(), {command, Cmd}}.
 
 % FIXME why test list?
 handle_event(GstkPid, Bytes) when is_list(Bytes) ->
-    Event = tcl2erl:parse_event(Bytes),
-    ?DBG(1,"Event = ~p\n",[Event]),
-    gstk:event(GstkPid, Event). %% Event is {ID, Etag, Args}
+    gstk:event(GstkPid, tcl2erl:parse_event(Bytes)). %% Event is {ID, Etag, Args}
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_radiobutton.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_radiobutton.erl
--- otp_src_19.0.5/lib/gs/src/gstk_radiobutton.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_radiobutton.erl	2016-08-25 16:37:44.566693320 +0300
@@ -31,8 +31,8 @@
 %%  Attributes:
 %%	activebg		Color
 %%	activefg		Color
-%%	align			n,w,s,e,nw,se,ne,sw,center
-%%	anchor			n,w,s,e,nw,se,ne,sw,center
+%%	align			n, w,s, e,nw, se, ne, sw, center
+%%	anchor			n, w,s, e,nw, se, ne, sw, center
 %%	bg			Color
 %%	bw			Int
 %%	data			Data
@@ -89,7 +89,7 @@
 %%	font			??????
 %%
 
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -100,15 +100,14 @@
 %% Function   	: create/3
 %% Purpose    	: Create a widget of the type defined in this module.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-create(DB, GstkId, Opts) ->
-    TkW = gstk_generic:mk_tkw_child(DB,GstkId),
-    {G, GID, V, NOpts} = fix_group_and_value(Opts, DB, GstkId#gstkid.owner),
-    NGstkId=GstkId#gstkid{widget=TkW,widget_data={G, GID, V}},
-    PlacePreCmd = [";place ", TkW],
-    case gstk_generic:make_command(NOpts, NGstkId, TkW, "", PlacePreCmd, DB) of
-	{error,Reason} -> {error,Reason};
+create(DB, #gstkid{owner = Owner} = GstkId, Opts) ->
+    TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+    {G, GID, V, NOpts} = fix_group_and_value(Opts, DB, Owner),
+    NGstkId = GstkId#gstkid{widget = TkW, widget_data = {G, GID, V}},
+    case gstk_generic:make_command(NOpts, NGstkId, TkW, "", [";place ", TkW], DB) of
+	{error, _Reason} = E -> E;
 	Cmd when is_list(Cmd) ->
-	    gstk:exec(["radiobutton ", TkW," -bo 2 -indi true ",Cmd]),
+	    gstk:exec(["radiobutton ", TkW, " -bo 2 -indi true ", Cmd]),
 	    NGstkId
     end.
 
@@ -121,12 +120,9 @@ create(DB, GstkId, Opts) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    TkW = Gstkid#gstkid.widget,
-    {NOpts, NGstkid} = fix_group_and_value(Opts, DB, Gstkid#gstkid.owner, Gstkid),
-    SimplePreCmd = [TkW, " conf"],
-    PlacePreCmd = [";place ", TkW],
-    gstk_generic:mk_cmd_and_exec(NOpts,NGstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{owner = Owner, widget = TkW} = Gstkid, Opts) ->
+    {NOpts, NGstkid} = fix_group_and_value(Opts, DB, Owner, Gstkid),
+    gstk_generic:mk_cmd_and_exec(NOpts, NGstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -137,9 +133,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -149,12 +143,10 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget_data = {_, Gid, _}, widget = TkW} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    {_, Gid, _} = Gstkid#gstkid.widget_data,
     gstk_db:delete_bgrp(DB, Gid),
-    Gstkid#gstkid.widget.
-
+    TkW.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: event/5
@@ -168,17 +160,13 @@ delete(DB, Gstkid) ->
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 event(DB, Gstkid, Etype, Edata, Args) ->
-    Arg2 = case Etype of
-	      click ->
-		  [Text, _Grp | Rest] = Args,
-		  {G, _Gid, V} = Gstkid#gstkid.widget_data,
-		  [Text, G, V | Rest];
-	      _Other ->
-		  Args
-	  end,
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Arg2).
-
-
+    gstk_generic:event(DB, Gstkid, Etype, Edata, if
+						     Etype =:= click ->
+							 [Text, _Grp|Rest] = Args,
+							 {G, _Gid, V} = Gstkid#gstkid.widget_data,
+							 [Text, G, V|Rest];
+						     true -> Args
+						 end).
 
 %%------------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -193,21 +181,34 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
-    case Option of
-	{disabledfg,  Color} -> {s, [" -disabledforegr ", gstk:to_color(Color)]};
-	{group,       Group} -> {s, [" -var ", gstk:to_ascii(Group)]};
-	{selectbg,    Color} -> {s, [" -selectc ", gstk:to_color(Color)]};
-	{underline,     Int} -> {s, [" -un ", gstk:to_ascii(Int)]};
-	{value,           V} -> {s, [" -val ", gstk:to_ascii(V)]};
-	{wraplength,    Int} -> {s, [" -wr ", gstk:to_ascii(Int)]};
-	flash                -> {c, [TkW, " f;"]};
-	invoke               -> {c, [TkW, " i;"]};
-	{select,       true} -> {c, [TkW, " se;"]};
-	{select,      false} -> {c, [TkW, " des;"]};
-	{click,          On} -> cbind(DB, Gstkid, click, On);
-	_                    -> invalid_option
-    end.
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
+
+option({click, On}, Gstkid, _TkW, DB) -> cbind(DB, Gstkid, click, On);
+option(Option, _Gstkid, TkW, _DB) -> option(Option, TkW).
+
+option(flash, TkW) -> option_c(" f;", TkW);
+option(invoke, TkW) -> option_c(" i;", TkW);
+option({select, true}, TkW) -> option_c(" se;", TkW);
+option({select, false}, TkW) -> option_c(" dse;", TkW);
+option(Option, _TkW) -> option(Option).
+
+option({disabledfg, Color}) -> to_color(" -disabledforegr ", gstk:to_color(Color));
+option({group, Group}) -> to_ascii(" -var ", gstk:to_ascii(Group));
+option({selectbg, Color}) -> to_color(" -selectc ", gstk:to_color(Color));
+option({underline, Int}) -> to_ascii(" -un ", gstk:to_ascii(Int));
+option({value, V}) -> to_ascii(" -val ", gstk:to_ascii(V));
+option({wraplength, Int}) -> to_ascii(" -wr ", gstk:to_ascii(Int));
+option(_Option) -> invalid_option.
+
+option_c(Str, TkW) -> {c, [TkW, Str]}.
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
+
+to_ascii(Str, V) -> option_s(Str, gstk:to_ascii(V)).
+
+to_color(Str, Color) -> option_s(Str, gstk:to_color(Color)).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/4
@@ -219,27 +220,30 @@ option(Option, Gstkid, TkW, DB,_) ->
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid, TkW,DB,_) -> 
-    case Option of
-	disabledfg    -> tcl2erl:ret_color([TkW," cg -disabledforegr"]);
-	group         -> {G, _, _} = Gstkid#gstkid.widget_data, G;
-	groupid       -> {_, Gid, _} = Gstkid#gstkid.widget_data, Gid;
-	selectbg      -> tcl2erl:ret_color([TkW," cg -selectc"]);
-	underline     -> tcl2erl:ret_int([TkW," cg -un"]);
-	value         -> {_, _, V} = Gstkid#gstkid.widget_data, V;
-	wraplength    -> tcl2erl:ret_int([TkW," cg -wr"]);
+read_option(Option, Gstkid, TkW, DB, _) -> read_option(Option, Gstkid, TkW, DB).
 
-	select        ->
-	    Cmd = ["list [set x [",TkW," cg -var];global $x;set $x] [",
-		   TkW," cg -val]"],
-	    case tcl2erl:ret_tuple(Cmd) of
-		{X, X} -> true;
-		_Other  -> false
-	    end;
+read_option(click, Gstkid, _TkW, DB) -> gstk_db:is_inserted(DB, Gstkid, click);
+read_option(Option, Gstkid, TkW, _DB) -> read_option(Option, Gstkid, TkW).
 
-	click         -> gstk_db:is_inserted(DB, Gstkid, click);
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
-    end.
+read_option(disabledfg, _Gstkid, TkW) -> ret_color(TkW, " cg -disabledforegr");
+read_option(selectbg, _Gstkid, TkW) -> ret_color(TkW, " cg -selectc");
+read_option(underline, _Gstkid, TkW) -> ret_int(TkW, " cg -un");
+read_option(wraplength, _Gstkid, TkW) -> ret_int(TkW, " cg -wr");
+read_option(select, _Gstkid, TkW) ->
+    case tcl2erl:ret_tuple(["list [set x [", TkW, " cg -var];global $x;set $x] [", TkW, " cg -val]"]) of
+	{X, X} -> true;
+	_Other  -> false
+    end;
+read_option(Option, Gstkid, _TkW) -> read_option(Option, Gstkid).
+
+read_option(group, #gstkid{widget_data = {G, _, _}}) -> G;
+read_option(groupid, #gstkid{widget_data = {_, Gid, _}}) -> Gid;
+read_option(value, #gstkid{widget_data = {_, _, V}}) -> V;
+read_option(Option, #gstkid{objtype = ObjType}) -> {bad_result, {ObjType, invalid_option, Option}}.
+
+ret_color(TkW, Str) -> tcl2erl:ret_color([TkW, Str]).
+
+ret_int(TkW, Str) -> tcl2erl:ret_int([TkW, Str]).
 
 %%------------------------------------------------------------------------------
 %%			       PRIMITIVES
@@ -248,96 +252,67 @@ read_option(Option,Gstkid, TkW,DB,_) ->
 %% create version
 fix_group_and_value(Opts, DB, Owner) ->
     {G, GID, V, NOpts} = fgav(Opts, erlNIL, erlNIL, erlNIL, []),
-    RV = case V of
-	     erlNIL -> list_to_atom(lists:concat([v,gstk_db:counter(DB,value)]));
-	     Other0 -> Other0
+    RV = if
+	     V =:= erlNIL -> list_to_atom(lists:concat([v, gstk_db:counter(DB, value)]));
+	     true -> V
 	 end,
-    NG = case G of
-	       erlNIL -> rb;
-	       Other1 -> Other1
-	   end,
-    RGID = case GID of
-	       erlNIL -> {rbgrp, NG, Owner};
-	       Other2 -> Other2
+    NG = if
+	     G =:= erlNIL -> rb;
+	     true -> G
+	 end,
+    RGID = if
+	       GID =:= erlNIL -> {rbgrp, NG, Owner};
+	       true -> GID
 	   end,
-    RG = gstk_db:insert_bgrp(DB, RGID),
-    {NG, RGID, RV, [{group, RG}, {value, RV} | NOpts]}.
-    
+    {NG, RGID, RV, [{group, gstk_db:insert_bgrp(DB, RGID)}, {value, RV} | NOpts]}.
+
 %% config version
-fix_group_and_value(Opts, DB, Owner, Gstkid) ->
-    {RG, RGID, RV} = Gstkid#gstkid.widget_data,
-    {G, GID, V, NOpts} = fgav(Opts, RG, RGID, RV, []),
-    case {G, GID, V} of
-	{RG, RGID, RV} ->
-	    {NOpts, Gstkid};
-	{NG, RGID, RV} ->
+fix_group_and_value(Opts, DB, Owner, #gstkid{widget_data = {RG, RGID, RV}} = Gstkid) ->
+    case fgav(Opts, RG, RGID, RV, []) of
+	{RG, RGID, RV, NOpts} -> {NOpts, Gstkid};
+	{NG, RGID, RV, NOpts} ->
 	    NGID = {rbgrp, NG, Owner},
 	    gstk_db:delete_bgrp(DB, RGID),
-	    NRG = gstk_db:insert_bgrp(DB, NGID),
-	    NGstkid = Gstkid#gstkid{widget_data={NG,NGID,RV}},
+	    NGstkid = Gstkid#gstkid{widget_data = {NG, NGID, RV}},
 	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{group, NRG} | NOpts], NGstkid};
-	{RG, RGID, NRV} ->
-	    NGstkid = Gstkid#gstkid{widget_data={RG,RGID,NRV}},
+	    {[{group, gstk_db:insert_bgrp(DB, NGID)}|NOpts], NGstkid};
+	{RG, RGID, NRV, NOpts} ->
+	    NGstkid = Gstkid#gstkid{widget_data = {RG, RGID, NRV}},
 	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{value,NRV} | NOpts], NGstkid};
-	{_, NGID, RV} when NGID =/= RGID ->
+	    {[{value, NRV}|NOpts], NGstkid};
+	{_, NGID, RV, NOpts} ->
 	    gstk_db:delete_bgrp(DB, RGID),
-	    NRG = gstk_db:insert_bgrp(DB, NGID),
-	    NGstkid = Gstkid#gstkid{widget_data={RG,NGID,RV}},
+	    NGstkid = Gstkid#gstkid{widget_data = {RG, NGID, RV}},
 	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{group, NRG} | NOpts], NGstkid};
-	{_, NGID, NRV} when NGID =/= RGID ->
+	    {[{group, gstk_db:insert_bgrp(DB, NGID)}|NOpts], NGstkid};
+	{NG, RGID, NRV, NOpts} ->
+	    NGID = {rbgrp, NG, Owner},
 	    gstk_db:delete_bgrp(DB, RGID),
-	    NRG = gstk_db:insert_bgrp(DB, NGID),
-	    NGstkid = Gstkid#gstkid{widget_data={RG,NGID,NRV}},
+	    NGstkid = Gstkid#gstkid{widget_data = {NG, NGID, NRV}},
 	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{group, NRG}, {value,NRV} | NOpts], NGstkid};
-	{NG, RGID, NRV} ->
-	    NGID = {rbgrp, NG, Owner},
+	    {[{group, gstk_db:insert_bgrp(DB, NGID)}, {value, NRV}|NOpts], NGstkid};
+	{_, NGID, NRV, NOpts} ->
 	    gstk_db:delete_bgrp(DB, RGID),
-	    NRG = gstk_db:insert_bgrp(DB, NGID),
-	    NGstkid = Gstkid#gstkid{widget_data={NG,NGID,NRV}},
+	    NGstkid = Gstkid#gstkid{widget_data = {RG, NGID, NRV}},
 	    gstk_db:insert_widget(DB, NGstkid),
-	    {[{group, NRG}, {value,NRV} | NOpts], NGstkid}
+	    {[{group, gstk_db:insert_bgrp(DB, NGID)}, {value, NRV}|NOpts], NGstkid}
     end.
 
-
-
-fgav([{group, G} | Opts], _, GID, V, Nopts) ->
-    fgav(Opts, G, GID, V, Nopts);
-
-fgav([{groupid, GID} | Opts], G, _, V, Nopts) ->
-    fgav(Opts, G, GID, V, Nopts);
-
-fgav([{value, V} | Opts], G, GID, _, Nopts) ->
-    fgav(Opts, G, GID, V, Nopts);
-
-fgav([Opt | Opts], G, GID, V, Nopts) ->
-    fgav(Opts, G, GID, V, [Opt | Nopts]);
-
-fgav([], Group, GID, Value, Opts) ->
-    {Group, GID, Value, Opts}.
+fgav([{group, G}|Opts], _, GID, V, Nopts) -> fgav(Opts, G, GID, V, Nopts);
+fgav([{groupid, GID}|Opts], G, _, V, Nopts) -> fgav(Opts, G, GID, V, Nopts);
+fgav([{value, V}|Opts], G, GID, _, Nopts) -> fgav(Opts, G, GID, V, Nopts);
+fgav([Opt|Opts], G, GID, V, Nopts) -> fgav(Opts, G, GID, V, [Opt|Nopts]);
+fgav([], Group, GID, Value, Opts) -> {Group, GID, Value, Opts}.
 
 %%
 %% Config bind
 %%
-cbind(DB, Gstkid, Etype, On) ->
-    TkW = Gstkid#gstkid.widget,
-    Cmd = case On of
-	      {true, Edata} ->
-		  Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
-		  [" -command {erlsend ", Eref,
-		   " \\\"[", TkW, " cg -text]\\\" [", TkW, " cg -var]}"];
-	      true ->
-		  Eref = gstk_db:insert_event(DB, Gstkid, Etype, ""),
-		  [" -command {erlsend ", Eref,
-		   " \\\"[", TkW, " cg -text]\\\" [", TkW, " cg -var]}"];
-	      _Other ->
-		  gstk_db:delete_event(DB, Gstkid, Etype),
-		  " -command {}"
-	  end,
-    {s, Cmd}.
+cbind(DB, #gstkid{widget = TkW} = Gstkid, Etype, {true, Edata}) ->
+    option_s([" -command {erlsend ", gstk_db:insert_event(DB, Gstkid, Etype, Edata),
+	      " \\\"[", TkW, " cg -text]\\\" [", TkW, " cg -var]}"]);
+cbind(DB, Gstkid, Etype, true) -> cbind(DB, Gstkid, Etype, {true, ""});
+cbind(DB, Gstkid, Etype, _On) ->
+    gstk_db:delete_event(DB, Gstkid, Etype),
+    option_s(" -command {}").
 
 %% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_rectangle.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_rectangle.erl
--- otp_src_19.0.5/lib/gs/src/gstk_rectangle.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_rectangle.erl	2016-08-25 16:37:44.566693320 +0300
@@ -24,14 +24,14 @@
 %% ------------------------------------------------------------
 
 -module(gstk_rectangle).
--compile([{nowarn_deprecated_function,{gs,pair,2}}]).
+-compile([{nowarn_deprecated_function, {gs, pair, 2}}]).
 
 %%-----------------------------------------------------------------------------
 %% 			    RECTANGLE OPTIONS
 %%
 %%  Attributes:
 %%	bw			Int
-%%	coords			[{X1,Y1}, {X2,Y2}]
+%%	coords			[{X1, Y1}, {X2, Y2}]
 %%	data			Data
 %%	fg			Color
 %%	fill			Color
@@ -61,8 +61,7 @@
 %%
 
 
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
-	 option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -82,26 +81,21 @@
 %%
 %% Return 	: [Gsid_of_new_widget | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-create(DB,Gstkid, Opts) ->
-    case gstk_canvas:pickout_coords(Opts, [],rectangle,2) of
-	{error, Error} ->
-	    {bad_result, Error};
+create(DB, Gstkid, Opts) ->
+    case gstk_canvas:pickout_coords(Opts, [], rectangle, 2) of
+	{error, Error} -> {bad_result, Error};
 	{Coords, NewOpts} ->
-	    gstk_db:insert_opt(DB,Gstkid,gs:pair(coords,Opts)),
-	    Ngstkid=gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
-	    #gstkid{widget=CanvasTkW}=Ngstkid,
-	    MCmd = [CanvasTkW, " create re ", Coords],
-	    gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid,CanvasTkW, MCmd, DB)
+	    gstk_db:insert_opt(DB, Gstkid, gs:pair(coords, Opts)),
+	    #gstkid{widget = CanvasTkW} = Ngstkid = gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
+	    gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create re ", Coords], DB)
     end.
 
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
 %% Purpose    	: Configure a widget of the type defined in this module.
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    gstk_canvas:item_config(DB, Gstkid, Opts).
+config(DB, Gstkid, Opts) -> gstk_canvas:item_config(DB, Gstkid, Opts).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -112,9 +106,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    Item = Gstkid#gstkid.widget_data,
-    gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
+read(DB, #gstkid{widget_data = Item} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -124,8 +116,7 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy | {Parent, Objmod, Args}.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
-    gstk_canvas:item_delete_impl(DB,Gstkid).
+delete(DB, Gstkid) -> gstk_canvas:item_delete_impl(DB, Gstkid).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: destroy/3
@@ -136,12 +127,9 @@ delete(DB, Gstkid) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
-    gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
 
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%------------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -157,13 +145,13 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, _Gstkid, _Canvas, _DB, _AItem) ->
-    case Option of
-	{bw,            Int} -> {s, [" -w ", gstk:to_ascii(Int)]};
-	{fg,          Color} -> {s, [" -outline ", gstk:to_color(Color)]};
-	_ -> invalid_option
-    end.
+option(Option, _Gstkid, _Canvas, _DB, _AItem) -> option(Option).
 
+option({bw, Int}) -> option_s(" -w ", gstk:to_ascii(Int));
+option({fg, Color}) -> option_s(" -outline ", gstk:to_color(Color));
+option(_Option) -> invalid_option.
+
+option_s(Str, Val) -> {s, [Str, Val]}.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
@@ -175,12 +163,14 @@ option(Option, _Gstkid, _Canvas, _DB, _A
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 read_option(Option, Gstkid, Canvas, _DB, AItem) ->
-    case Option of
-	bw       -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
-	fg       -> tcl2erl:ret_color([Canvas," itemcg ", AItem, " -outline"]);
-	stipple  ->
-	    tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -stipple"]);
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+    case read_option(Option, AItem, Canvas) of
+	invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+	O -> O
     end.
 
+read_option(bw, AItem, Canvas) -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
+read_option(fg, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -outline"]);
+read_option(stipple, AItem, Canvas) -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -stipple"]);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
+
 %% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_scale.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_scale.erl
--- otp_src_19.0.5/lib/gs/src/gstk_scale.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_scale.erl	2016-08-25 16:37:44.566693320 +0300
@@ -30,7 +30,7 @@
 %%
 %%  Attributes:
 %%	activebg		Color
-%%	anchor			n,w,s,e,nw,se,ne,sw,center
+%%	anchor			n, w,s, e,nw, se, ne, sw, center
 %%	bg			Color
 %%	bw			Int
 %%	data			Data
@@ -72,8 +72,7 @@
 %%	type
 %%
 
--export([create/3,config/3,read/3,delete/2,event/5,
-	 option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -85,14 +84,12 @@
 %% Purpose    	: Create a widget of the type defined in this module.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, GstkId, Opts) ->
-    TkW = gstk_generic:mk_tkw_child(DB,GstkId),
-    PlacePreCmd = [";place ", TkW],
-    Ngstkid = GstkId#gstkid{widget=TkW},
-    case gstk_generic:make_command(Opts, Ngstkid, TkW,"", PlacePreCmd, DB) of
-	{error,Reason} -> {error,Reason};
+    TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+    Ngstkid = GstkId#gstkid{widget = TkW},
+    case gstk_generic:make_command(Opts, Ngstkid, TkW, "", [";place ", TkW], DB) of
+	{error, _Reason} = E -> E;
 	Cmd when is_list(Cmd) ->
-	    gstk:exec(["scale ", TkW,Cmd,$;,TkW,
-		      " conf -bo 2 -sliderrelief raised -highlightth 2"]),
+	    gstk:exec(["scale ", TkW, Cmd, $;, TkW, " conf -bo 2 -sliderrelief raised -highlightth 2"]),
 	    Ngstkid
     end.
 
@@ -105,11 +102,8 @@ create(DB, GstkId, Opts) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    TkW = Gstkid#gstkid.widget,
-    SimplePreCmd = [TkW, " conf"],
-    PlacePreCmd = [";place ", TkW],
-    gstk_generic:mk_cmd_and_exec(Opts,Gstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+    gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -120,9 +114,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -132,12 +124,11 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    Gstkid#gstkid.widget.
+    TkW.
 
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%-----------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -150,20 +141,28 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
-    case Option of
-	{activebg,    Color} -> {s, [" -activeb ", gstk:to_color(Color)]};
-	{orient,        How} -> {s, [" -or ", gstk:to_ascii(How)]};
-	{range,  {From, To}} -> {s, [" -fr ", gstk:to_ascii(From),
-				     " -to ", gstk:to_ascii(To)]};
-        {relief,     Relief} -> {s, [" -rel ", gstk:to_ascii(Relief)]};
-        {bw,            Wth} -> {s, [" -bd ", gstk:to_ascii(Wth)]};
-	{text,       String} -> {s, [" -la ",gstk:to_ascii(String)]};
-	{showvalue,    Bool} -> {s, [" -showvalue ",gstk:to_ascii(Bool)]};
-	{pos,           Pos} -> {c, [TkW, " set ", gstk:to_ascii(Pos)]};
-	{click,          On} -> cbind(DB, Gstkid, click, On);
-	_                    -> invalid_option
-    end.
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
+
+option({click, On}, Gstkid, _TkW, DB) -> cbind(DB, Gstkid, click, On);
+option(Option, _Gstkid, TkW, _DB) -> option(Option, TkW).
+
+option({pos, Pos}, TkW) -> {c, [TkW, " set ", gstk:to_ascii(Pos)]};
+option(Option, _TkW) -> option(Option).
+
+option({activebg, Color}) -> option_s(" -activeb ", gstk:to_color(Color));
+option({bw, Wth}) -> to_ascii(" -bd ", Wth);
+option({orient, How}) -> to_ascii(" -or ", How);
+option({relief, Relief}) -> to_ascii(" -rel ", Relief);
+option({text, String}) -> to_ascii(" -la ", String);
+option({showvalue, Bool}) -> to_ascii(" -showvalue ", Bool);
+option({range, {From, To}}) -> option_s([" -fr ", gstk:to_ascii(From), " -to ", gstk:to_ascii(To)]);
+option(_Option) -> invalid_option.
+
+to_ascii(Str, Val) -> option_s([Str, gstk:to_ascii(Val)]).
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
@@ -175,41 +174,41 @@ option(Option, Gstkid, TkW, DB,_) ->
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid,TkW,DB,_) -> 
-    case Option of
-	activebg      -> tcl2erl:ret_color([TkW," cg -activeb"]);
-	orient        -> tcl2erl:ret_atom([TkW," cg -ori"]);
-	range         ->
-	    tcl2erl:ret_tuple(["list [",TkW," cg -fr] [",TkW," cg -to]"]);
-        bw            -> tcl2erl:ret_int([TkW," cg -bd"]);
-        relief        -> tcl2erl:ret_atom([TkW, " cg -reli"]);
-	text          -> tcl2erl:ret_str([TkW," cg -lab"]);
-	showvalue     -> tcl2erl:ret_bool([TkW," cg -showvalue"]);
-	pos           -> tcl2erl:ret_int([TkW," get"]);
-	click         -> gstk_db:is_inserted(DB, Gstkid, click);
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(Option, Gstkid, TkW, DB, _) -> read_option(Option, Gstkid, TkW, DB).
+
+read_option(click, Gstkid, _TkW, DB) -> gstk_db:is_inserted(DB, Gstkid, click);
+read_option(Option, Gstkid, TkW, _DB) ->
+    case read_option(Option, TkW) of
+	invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+	O -> O
     end.
 
+read_option(activebg, TkW) -> tcl2erl:ret_color([TkW, " cg -activeb"]);
+read_option(orient, TkW) -> ret_atom(" cg -ori", TkW);
+read_option(range, TkW) -> tcl2erl:ret_tuple(["list [", TkW, " cg -fr] [", TkW, " cg -to]"]);
+read_option(bw, TkW) -> ret_int(" cg -bd", TkW);
+read_option(relief, TkW) -> ret_atom(" cg -reli", TkW);
+read_option(text, TkW) -> tcl2erl:ret_str([TkW, " cg -lab"]);
+read_option(showvalue, TkW) -> tcl2erl:ret_bool([TkW, " cg -showvalue"]);
+read_option(pos, TkW) -> ret_int(" get", TkW);
+read_option(_Option, _TkW) -> invalid_option.
+
+ret_atom(Str, TkW) -> tcl2erl:ret_atom([TkW, Str]).
+
+ret_int(Str, TkW) -> tcl2erl:ret_int([TkW, Str]).
+
 %%-----------------------------------------------------------------------------
 %%			       PRIMITIVES
 %%-----------------------------------------------------------------------------
 
-
 %%
 %% Config bind
 %%
-cbind(DB, Gstkid, Etype, On) ->
-    Cmd = case On of
-	      {true, Edata} ->
-		  Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
-		  [" -command {erlsend ", Eref, "}"];
-	      true ->
-		  Eref = gstk_db:insert_event(DB, Gstkid, Etype, ""),
-		  [" -command {erlsend ", Eref, "}"];
-	      _Other ->
-		  gstk_db:delete_event(DB, Gstkid, Etype),
-		  " -command {}"
-	  end,
-    {s, Cmd}.
+cbind(DB, Gstkid, Etype, true) -> cbind(DB, Gstkid, Etype, {true, ""});
+cbind(DB, Gstkid, Etype, {true, Edata}) ->
+    option_s([" -command {erlsend ", gstk_db:insert_event(DB, Gstkid, Etype, Edata), "}"]);
+cbind(DB, Gstkid, Etype, _On) ->
+    gstk_db:delete_event(DB, Gstkid, Etype),
+    option_s(" -command {}").
 
 %% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_text.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_text.erl
--- otp_src_19.0.5/lib/gs/src/gstk_text.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_text.erl	2016-08-25 16:39:20.254844888 +0300
@@ -30,7 +30,7 @@
 %%
 %%  Attributes:
 %%	anchor			n|w|e|s|nw|sw|ne|se|center
-%%	coords			[{X,Y}]
+%%	coords			[{X, Y}]
 %%	data			Data
 %%	fg			Color
 %%	font			Font
@@ -64,11 +64,10 @@
 %%  Not Implemented:
 %%	fontfamily		?????? Family
 %%	fontsize		?????? Size
-%%	style			?????? [bold,italic]
+%%	style			?????? [bold, italic]
 %%
 
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
-	 option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
 
 -include("gstk.hrl").
 
@@ -76,25 +75,19 @@
 %%			MANDATORY INTERFACE FUNCTIONS
 %%----------------------------------------------------------------------------
 create(DB, Gstkid, Opts) ->
-    case gstk_canvas:pickout_coords(Opts, [],text,1) of
-	{error, Error} ->
-	    {bad_result, Error};
+    case gstk_canvas:pickout_coords(Opts, [], text, 1) of
+	{error, Error} -> {bad_result, Error};
 	{Coords, NewOpts} ->
-	    Ngstkid=gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
-	    #gstkid{widget=CanvasTkW}=Ngstkid,
-	    MCmd = [CanvasTkW, " create te ", Coords],
-	    gstk_canvas:mk_cmd_and_call(NewOpts,Ngstkid,CanvasTkW, MCmd, DB)
+	    #gstkid{widget = CanvasTkW} = Ngstkid = gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
+	    gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create te ", Coords], DB)
     end.
 
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
 %% Purpose    	: Configure a widget of the type defined in this module.
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    gstk_canvas:item_config(DB, Gstkid, Opts).
-
+config(DB, Gstkid, Opts) -> gstk_canvas:item_config(DB, Gstkid, Opts).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -105,10 +98,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    Item = Gstkid#gstkid.widget_data,
-    gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
-
+read(DB, #gstkid{widget_data = Item} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -118,9 +108,7 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy | {Parent, Objmod, Args}.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
-    gstk_canvas:item_delete_impl(DB,Gstkid).
-    
+delete(DB, Gstkid) -> gstk_canvas:item_delete_impl(DB, Gstkid).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: destroy/3
@@ -131,13 +119,9 @@ delete(DB, Gstkid) ->
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
-    gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
-
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
 
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
 %%-----------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
@@ -150,19 +134,23 @@ event(DB, Gstkid, Etype, Edata, Args) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, _Canvas, DB, _AItem) ->
-    case Option of
-	{anchor,         How} -> {s, [" -anchor ", gstk:to_ascii(How)]};
-	{fg,          Color} -> {s, [" -fi ", gstk:to_color(Color)]};
-	{font, Font} when is_tuple(Font) ->
-	    gstk_db:insert_opt(DB,Gstkid,Option),
-	    {s, [" -fo ", gstk_font:choose_ascii(DB,Font)]};
-	{justify,       How} -> {s, [" -j ", gstk:to_ascii(How)]};
-	{text,         Text} -> {s, [" -te ", gstk:to_ascii(Text)]};
-	{width,       Width} -> {s, [" -w ", gstk:to_ascii(Width)]};
-	_ -> invalid_option
-    end.
+option(Option, Gstkid, _Canvas, DB, _AItem) -> option(Option, Gstkid, DB).
 
+option({font, Font} = Option, Gstkid, DB) when is_tuple(Font) ->
+    gstk_db:insert_opt(DB, Gstkid, Option),
+    {s, [" -fo ", gstk_font:choose_ascii(DB, Font)]};
+option(Option, _Gstkid, _DB) -> option(Option).
+
+option({fg, Color}) -> option_s([" -fi ", gstk:to_color(Color)]);
+option({anchor, How}) -> option_s(" -anchor ", How);
+option({justify, How}) -> option_s(" -j ", How);
+option({text, Text}) -> option_s(" -te ", Text);
+option({width, Width}) -> option_s(" -w ", Width);
+option(_Option) -> invalid_option.
+
+option_s(Str, Val) -> option_s([Str, gstk:to_ascii(Val)]).
+
+option_s(L) -> {s, L}.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/5
@@ -174,17 +162,21 @@ option(Option, Gstkid, _Canvas, DB, _AIt
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option, Gstkid, Canvas, DB, AItem) ->
-    case Option of
-	anchor   -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, " -anchor"]);
-	fg       -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -fi"]);
-	font     -> gstk_db:opt(DB,Gstkid,font,undefined);
-	justify  -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, " -j"]);
-	stipple  -> tcl2erl:ret_stipple([Canvas," itemcg ",AItem," -stipple"]);
-	text     -> tcl2erl:ret_str([Canvas, " itemcg ", AItem, " -te"]);
-	width    -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(font, Gstkid, _Canvas, DB, _AItem) -> gstk_db:opt(DB, Gstkid, font, undefined);
+read_option(Option, Gstkid, Canvas, _DB, AItem) ->
+    case read_option(Option, AItem, Canvas) of
+	invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+	O -> O
     end.
 
+read_option(anchor, AItem, Canvas) -> ret_atom(" -anchor", AItem, Canvas);
+read_option(fg, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -fi"]);
+read_option(justify, AItem, Canvas) -> ret_atom(" -j", AItem, Canvas);
+read_option(stipple, AItem, Canvas) -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -stipple"]);
+read_option(text, AItem, Canvas) -> tcl2erl:ret_str([Canvas, " itemcg ", AItem, " -te"]);
+read_option(width, AItem, Canvas) -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
+
+ret_atom(Str, AItem, Canvas) -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, Str]).
 
 %% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_widgets.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_widgets.erl
--- otp_src_19.0.5/lib/gs/src/gstk_widgets.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_widgets.erl	2016-08-25 16:37:44.566693320 +0300
@@ -30,65 +30,47 @@
 
 -include("gstk.hrl").
 
-
-
-
 %%
 %% Map primitive types to modules or false (false should not be a module!)
 %%
 %% ordered for efficiency
 
-type2mod(window)      -> gstk_window;
-type2mod(frame)       -> gstk_frame;
-type2mod(button)      -> gstk_button;
-type2mod(canvas)      -> gstk_canvas;
-type2mod(checkbutton) -> gstk_checkbutton;
-type2mod(rectangle)   -> gstk_rectangle;
-type2mod(gs)          -> gstk_gs;
-type2mod(grid)        -> gstk_grid;
-type2mod(gridline)    -> gstk_gridline;
-type2mod(text)        -> gstk_text;
-type2mod(image)       -> gstk_image;
-type2mod(label)       -> gstk_label;
-type2mod(line)        -> gstk_line;
-type2mod(entry)       -> gstk_entry;
-type2mod(listbox)     -> gstk_listbox;
-type2mod(editor)      -> gstk_editor;
-type2mod(menu)        -> gstk_menu;
-type2mod(menubar)     -> gstk_menubar;
-type2mod(menubutton)  -> gstk_menubutton;
-type2mod(menuitem)    -> gstk_menuitem;
-type2mod(message)     -> gstk_message;
-type2mod(oval)        -> gstk_oval;
-type2mod(polygon)     -> gstk_polygon;
-type2mod(prompter)    -> gstk_prompter;
-type2mod(radiobutton) -> gstk_radiobutton;
-type2mod(scale)       -> gstk_scale;
-type2mod(scrollbar)   -> gstk_scrollbar;
-type2mod(arc)         -> gstk_arc;
-type2mod(Type)        -> {error,{unknown_type, Type}}.
+type2mod(Type) ->
+    proplists:get_value(Type,
+			[{arc, gstk_arc},
+			 {button, gstk_button},
+			 {canvas, gstk_canvas}, {checkbutton, gstk_checkbutton},
+			 {editor, gstk_editor}, {entry, gstk_entry},
+			 {frame, gstk_frame},
+			 {grid, gstk_grid}, {gridline, gstk_gridline}, {gs, gstk_gs},
+			 {image, gstk_image},
+			 {label, gstk_label}, {line, gstk_line}, {listbox, gstk_listbox},
+			 {menu, gstk_menu}, {menubar, gstk_menubar}, {menubutton, gstk_menubutton},
+			 {menuitem, gstk_menuitem}, {message, gstk_message},
+			 {oval, gstk_oval},
+			 {polygon, gstk_polygon}, {prompter, gstk_prompter},
+			 {radiobutton, gstk_radiobutton}, {rectangle, gstk_rectangle},
+			 {scale, gstk_scale}, {scrollbar, gstk_scrollbar},
+			 {text, gstk_text},
+			 {window, gstk_window}],
+			{error, {unknown_type, Type}}).
 
-objmod(#gstkid{objtype=OT}) -> type2mod(OT).
+objmod(#gstkid{objtype = OT}) -> type2mod(OT).
 
 %%
 %% The suffix to add to the parent tk widget
 %%
-suffix(button)       -> ".b";
-suffix(canvas)       -> ".c";
-suffix(checkbutton)  -> ".cb";
-suffix(editor)       -> ".ed";
-suffix(entry)        -> ".e";
-suffix(frame)        -> ".f";
-suffix(label)        -> ".l";
-suffix(listbox)      -> ".lb";
-suffix(menu)         -> ".m";
-suffix(menubar)      -> ".bar";
-suffix(menubutton)   -> ".mb";
-suffix(message)      -> ".ms";
-suffix(prompter)     -> ".p";
-suffix(radiobutton)  -> ".rb";
-suffix(scale)        -> ".sc";
-suffix(window)       -> ".w";
-suffix(Objtype) -> apply(type2mod(Objtype), suffix, []).
-
-
+suffix(Objtype) ->
+    case proplists:get_value(Objtype, [{button, ".b"},
+				       {canvas, ".c"}, {checkbutton, ".cb"},
+				       {editor, ".ed"}, {entry, ".e"},
+				       {frame, ".f"},
+				       {label, ".l"}, {listbox, ".lb"},
+				       {menu, ".m"}, {menubar, ".bar"}, {menubutton, ".mb"}, {message, ".ms"},
+				       {prompter, ".p"},
+				       {radiobutton, ".rb"},
+				       {scale, ".sc"},
+				       {window, ".w"}]) of
+	undefined -> apply(type2mod(Objtype), suffix, []);
+	S -> S
+    end.
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_window.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_window.erl
--- otp_src_19.0.5/lib/gs/src/gstk_window.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_window.erl	2016-08-25 16:37:44.567693306 +0300
@@ -24,7 +24,8 @@
 %% ------------------------------------------------------------
 
 -module(gstk_window).
--compile([{nowarn_deprecated_function,{gs,destroy,1}}]).
+
+-compile([{nowarn_deprecated_function, {gs, destroy, 1}}]).
 
 %%------------------------------------------------------------------------------
 %% 			    WINDOW OPTIONS
@@ -81,8 +82,8 @@
 %%	focusmodel		[active|passive] (wm focusmodel)
 %%
 
--export([create/3, config/3, read/3, delete/2, event/5,destroy_win/1]).
--export([option/5,read_option/5,mk_create_opts_for_child/4]).
+-export([create/3, config/3, read/3, delete/2, event/5, destroy_win/1]).
+-export([option/5, read_option/5, mk_create_opts_for_child/4]).
 
 -include("gstk.hrl").
 % bind . <1> {puts "x: [expr %X - [winfo rootx .]] y: [expr %Y - [wi rooty .]]"}
@@ -95,22 +96,17 @@
 %% Purpose    	: Create a widget of the type defined in this module.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 create(DB, Gstkid, Opts) ->
-    TkW = gstk_generic:mk_tkw_child(DB,Gstkid),
-    NGstkid=Gstkid#gstkid{widget=TkW},
-    case gstk_generic:make_command(transform_geometry_opts(Opts),
-				  NGstkid, TkW, "", ";", DB) of
-	{error,Reason} -> {error,Reason};
+    TkW = gstk_generic:mk_tkw_child(DB, Gstkid),
+    NGstkid = Gstkid#gstkid{widget = TkW},
+    case gstk_generic:make_command(transform_geometry_opts(Opts), NGstkid, TkW, "", ";", DB) of
+	{error, _Reason} = E -> E;
 	Cmd when is_list(Cmd) ->
-	    BindCmd = gstk_generic:bind(DB, Gstkid, TkW, configure, true),
-%	    io:format("\nWINDOW1: ~p\n",[TkW]),
-%	    io:format("\nWINDOW1: ~p\n",[Cmd]),
-%	    io:format("\nWINDOW1: ~p\n",[BindCmd]),
-	    gstk:exec(["toplevel ", TkW,Cmd,$;,BindCmd]),
+	    gstk:exec(["toplevel ", TkW, Cmd, $;, gstk_generic:bind(DB, Gstkid, TkW, configure, true)]),
 	    NGstkid
     end.
 
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
-    gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+    gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: config/3
@@ -121,11 +117,8 @@ mk_create_opts_for_child(DB,Cgstkid, Pgs
 %%
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
-    TkW = Gstkid#gstkid.widget,
-    SimplePreCmd = [TkW, " conf"],
-    gstk_generic:mk_cmd_and_exec(transform_geometry_opts(Opts),
-				Gstkid,TkW,SimplePreCmd,"",DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+    gstk_generic:mk_cmd_and_exec(transform_geometry_opts(Opts), Gstkid, TkW, [TkW, " conf"], "", DB).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read/3
@@ -136,9 +129,7 @@ config(DB, Gstkid, Opts) ->
 %%
 %% Return 	: [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
-    gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: delete/2
@@ -148,10 +139,9 @@ read(DB, Gstkid, Opt) ->
 %%
 %% Return 	: TkWidget to destroy
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
     gstk_db:delete_widget(DB, Gstkid),
-    Gstkid#gstkid.widget.
-
+    TkW.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: event/5
@@ -164,24 +154,18 @@ delete(DB, Gstkid) ->
 %%		
 %% Return 	: [true | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-event(DB, Gstkid, configure, Edata, Args) ->
-    [W,H|_] = Args,
-    gstk_db:insert_opt(DB,Gstkid,{width,W}),
-    gstk_db:insert_opt(DB,Gstkid,{height,H}),
-    case gstk_db:opt(DB,Gstkid,configure) of
-	true ->
-	    apply(gstk_generic,event,[DB,Gstkid,configure,Edata,Args]);
-	false ->
-	    ok
+event(DB, Gstkid, configure, Edata, [W, H|_] = Args) ->
+    lists:foreach(fun(E) -> gstk_db:insert_opt(DB, Gstkid, E) end, [{width, W}, {height, H}]),
+    case gstk_db:opt(DB, Gstkid, configure) of
+	true -> gstk_generic:event(DB, Gstkid, configure, Edata, Args);
+	false -> ok
     end;
-event(DB, Gstkid, destroy, Edata, Args) ->
-    spawn(gstk_window,destroy_win,[gstk:make_extern_id(Gstkid#gstkid.id,DB)]),
+event(DB, #gstkid{id = Id} = Gstkid, destroy, Edata, Args) ->
+    spawn(gstk_window, destroy_win, [gstk:make_extern_id(Id, DB)]),
     gstk_generic:event(DB, Gstkid, destroy, Edata, Args);
-event(DB, Gstkid, Etype, Edata, Args) ->
-    gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
 
-destroy_win(ID) ->
-    gs:destroy(ID).
+destroy_win(ID) -> gs:destroy(ID).
 %%------------------------------------------------------------------------------
 %%			MANDATORY FUNCTIONS
 %%------------------------------------------------------------------------------
@@ -195,101 +179,89 @@ destroy_win(ID) ->
 %%
 %% Return 	: A tuple {OptionType, OptionCmd}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%-define(REGEXP,"regexp {(\\d+)x(\\d+)\\+?(-?\\d+)\\+?(-?\\d+)} ").
+%-define(REGEXP, "regexp {(\\d+)x(\\d+)\\+?(-?\\d+)\\+?(-?\\d+)} ").
 % FIXME: Is this ok? Always positive?
--define(REGEXP,"regexp {(\\d+)x(\\d+)\\+(\\d+)\\+(\\d+)} ").
+-define(REGEXP, "regexp {(\\d+)x(\\d+)\\+(\\d+)\\+(\\d+)} ").
 
-option(Option, Gstkid, TkW, DB,_) ->
-    case Option of
-%% Bug in tcl/tk complicates setting of a single x,y,width,height.
-	{x,               X} -> 
-	    {c, 
-	    [?REGEXP,"[wm ge ",TkW, "] g w h x y;wm ge ", TkW,
-	     " ${w}x$h",signed(X),"+$y;update idletasks"]};
-	{y,               Y} -> 
-	    {c,[?REGEXP,"[wm ge ",TkW, "] g w h x y;wm ge ", TkW,
-		" ${w}x$h+$x",signed(Y),"; update idletasks"]};
-	{width,       Width} when Width >= 0 ->	% FIXME: Needed test?
-	    case gstk_db:opt_or_not(DB,Gstkid,width) of
-		{value,Width} -> none;
-		_Q ->
-		    gstk_db:insert_opt(DB,Gstkid,{width,Width}),
-		    {c,[?REGEXP,"[wm ge ",TkW, "] g w h x y;wm ge ", TkW," ",
-			gstk:to_ascii(Width),"x$h+$x+$y;update idletasks"]}
-	    end;
-    	{height,     Height} when Height >= 0 -> % FIXME: Needed test?
-	    case gstk_db:opt_or_not(DB,Gstkid,height) of
-		{value,Height} -> none;
-		_Q ->				% FIXME: Why different?
-		    gstk_db:insert_opt(DB,Gstkid,{height,Height}),
-		    {c,
-		     ["wm ge ",TkW,
-		      " [winfo w ", TkW, "]x",gstk:to_ascii(Height),
-		      ";update idletasks"]}
-	    end;
-	{width_height, {W,H}} when W >= 0, H >= 0 ->
-	    case {gstk_db:opt_or_not(DB,Gstkid,width),
-		  gstk_db:opt_or_not(DB,Gstkid,height)} of
-		{{value,W},{value,H}} ->
-		    none;
-		_OtherSize -> 
-		    gstk_db:insert_opt(DB,Gstkid,{height,H}),
-		    gstk_db:insert_opt(DB,Gstkid,{width,W}),
-		    {c, ["update idletasks;wm ge ", TkW, " ",
-			 gstk:to_ascii(W),"x",gstk:to_ascii(H),
-			 ";update idletasks"]}
-	    end;
-	{xy,             {X,Y}} -> 
-	    {c, [?REGEXP,"[wm ge ",TkW, "] g w h x y;wm ge ", TkW,
-		 " ${w}x$h", signed(X),signed(Y),
-		 ";update idletasks"]};
-	{bg,          Color} -> {s, [" -bg ", gstk:to_color(Color)]};
-	{map,          true} -> {c, ["wm deiconify ", TkW]};
-	{map,         false} -> {c, ["wm withdraw ", TkW]};
-	{configure,      On} ->
-	    gstk_db:insert_opt(DB,Gstkid,{configure,On}),
-	    none;
-	{iconify,      true} -> {c, ["wm iconify ", TkW]};
-	{iconify,     false} -> {c, ["wm deiconify ", TkW]};
-	{title,       Title} -> {c, ["wm title ", TkW, " " , 
-					   gstk:to_ascii(Title)]};
-	{iconname,     Name} -> {c, ["wm iconn ",TkW, " ",
-					   gstk:to_ascii(Name)]};
-	{iconbitmap, Bitmap} -> {c, ["wm iconb ",TkW, " ",
-					   gstk:to_ascii(Bitmap)]};
-	{iconmask,   Bitmap} -> {c, ["wm iconm ",TkW, " ",
-					   gstk:to_ascii(Bitmap)]};
-	raise		     -> {c, ["raise ", TkW]};
-	lower		     -> {c, ["lower ", TkW]};
-	{setfocus,     true} -> {c, ["focus ", TkW]};
-	{setfocus,    false} -> {c, ["focus {}"]};
-	{buttonpress,    On} ->
-	    Eref = mk_eref(On, DB, Gstkid, buttonpress),
-	    {c,["bind ",TkW," <ButtonPress> ",
-	       event_onoff(["{erlsend ",Eref," %b ",xy_abs_str(TkW),"};"],On)]};
-	{buttonrelease,  On} ->
-	    Eref = mk_eref(On, DB, Gstkid, buttonrelease),
-	    {c,["bind ",TkW," <ButtonRelease> ",
-	       event_onoff(["{erlsend ",Eref," %b ",xy_abs_str(TkW),"};"],On)]};
-	{motion,         On} ->
-	    Eref = mk_eref(On, DB, Gstkid, motion),
-	    {c,["bind ",TkW," <Motion> ",
-	       event_onoff(["{erlsend ",Eref," ",xy_abs_str(TkW),"};"],On)]};
-	_                    -> invalid_option
-    end.
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
 
-xy_abs_str(TkW) ->
-    ["[expr %X-[winfo rootx ",TkW,"]] [expr %Y-[winfo rooty ",TkW,"]]"].
+option({configure, _} = Option, Gstkid, _TkW, DB) ->
+    gstk_db:insert_opt(DB, Gstkid, Option),
+    none;
+option({width, Width} = Option, Gstkid, TkW, DB) when Width >= 0 -> % FIXME: Needed test?
+    case gstk_db:opt_or_not(DB, Gstkid, width) of
+	{value, Width} -> none;
+	_Q ->
+	    gstk_db:insert_opt(DB, Gstkid, Option),
+	    option_c([?REGEXP, "[wm ge ", TkW, "] g w h x y;wm ge ", TkW, " ", gstk:to_ascii(Width),
+		      "x$h+$x+$y;update idletasks"])
+    end;
+option({height, Height} = Option, Gstkid, TkW, DB) when Height >= 0 -> % FIXME: Needed test?
+    case gstk_db:opt_or_not(DB, Gstkid, height) of
+	{value, Height} -> none;
+	_Q -> % FIXME: Why different?
+	    gstk_db:insert_opt(DB, Gstkid, Option),
+	    option_c(["wm ge ", TkW, " [winfo w ", TkW, "]x", gstk:to_ascii(Height), ";update idletasks"])
+    end;
+option({width_height, {W, H}}, Gstkid, TkW, DB) when W >= 0, H >= 0 ->
+    case {gstk_db:opt_or_not(DB, Gstkid, width), gstk_db:opt_or_not(DB, Gstkid, height)} of
+	{{value, W}, {value, H}} -> none;
+	_OtherSize ->
+	    lists:foreach(fun(E) -> gstk_db:insert_opt(DB, Gstkid, E) end, [{height, H}, {width, W}]),
+	    option_c(["update idletasks;wm ge ", TkW, " ", gstk:to_ascii(W), "x", gstk:to_ascii(H), ";update idletasks"])
+    end;
+option({buttonpress, On}, Gstkid, TkW, DB) ->
+    option_c(["bind ", TkW, " <ButtonPress> ",
+	      event_onoff(["{erlsend ", mk_eref(On, DB, Gstkid, buttonpress), " %b ", xy_abs_str(TkW), "};"], On)]);
+option({buttonrelease, On}, Gstkid, TkW, DB) ->
+    option_c(["bind ", TkW, " <ButtonRelease> ",
+	      event_onoff(["{erlsend ", mk_eref(On, DB, Gstkid, buttonrelease), " %b ", xy_abs_str(TkW), "};"], On)]);
+option({motion, On}, Gstkid, TkW, DB) ->
+    option_c(["bind ", TkW, " <Motion> ",
+	      event_onoff(["{erlsend ", mk_eref(On, DB, Gstkid, motion), " ", xy_abs_str(TkW), "};"], On)]);
+option(Option, _Gstkid, TkW, _DB) -> option(Option, TkW).
+
+option(lower, TkW) -> option_c("lower ", TkW);
+option(raise, TkW) -> option_c("raise ", TkW);
+option({setfocus, true}, TkW) -> option_c("focus ", TkW);
+option({map, true}, TkW) -> option_c("wm deiconify ", TkW);
+option({map, false}, TkW) -> option_c("wm withdraw ", TkW);
+option({iconify, true}, TkW) -> option_c("wm iconify ", TkW);
+option({iconify, false}, TkW) -> option_c("wm deiconify ", TkW);
+option({title, Title}, TkW) -> option_c(Title, "wm title ", TkW);
+option({iconname, Name}, TkW) -> option_c(Name, "wm iconn ", TkW);
+option({iconbitmap, Bitmap}, TkW) -> option_c(Bitmap, "wm iconb ", TkW);
+option({iconmask, Bitmap}, TkW) -> option_c(Bitmap, "wm iconm ", TkW);
+%% Bug in tcl/tk complicates setting of a single x, y,width, height.
+option({x, X}, TkW) ->
+    option_c([?REGEXP, "[wm ge ", TkW, "] g w h x y;wm ge ", TkW, " ${w}x$h", signed(X), "+$y;update idletasks"]);
+option({y, Y}, TkW) ->
+    option_c([?REGEXP, "[wm ge ", TkW, "] g w h x y;wm ge ", TkW, " ${w}x$h+$x", signed(Y), "; update idletasks"]);
+option({xy, {X, Y}}, TkW) ->
+    option_c([?REGEXP, "[wm ge ", TkW, "] g w h x y;wm ge ", TkW,
+	      " ${w}x$h", signed(X), signed(Y), ";update idletasks"]);
+option(Option, _TkW) -> option(Option).
+
+
+option({setfocus, false}) -> option_c(["focus {}"]);
+option({bg, Color}) -> {s, [" -bg ", gstk:to_color(Color)]};
+option(_Option) -> invalid_option.
+
+option_c(Str, TkW) -> option_c([Str, TkW]).
+
+option_c(L) -> {c, L}.
+
+option_c(Val, Str, TkW) -> option_c([Str, TkW, " " , gstk:to_ascii(Val)]).
+
+xy_abs_str(TkW) -> ["[expr %X-[winfo rootx ", TkW, "]] [expr %Y-[winfo rooty ", TkW, "]]"].
 
 event_onoff(Str, true) -> Str;
-event_onoff(_,false) -> "{}".
+event_onoff(_, false) -> "{}".
 
+mk_eref(true, DB, Gstkid, Etype) -> gstk_db:insert_event(DB, Gstkid, Etype, []);
 mk_eref(false, DB, Gstkid, Etype) ->
     gstk_db:delete_event(DB, Gstkid, Etype),
-    dummy;
-mk_eref(true,DB,Gstkid,Etype) ->
-    gstk_db:insert_event(DB, Gstkid, Etype, []).
-
+    dummy.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Function   	: read_option/3
@@ -301,39 +273,40 @@ mk_eref(true,DB,Gstkid,Etype) ->
 %% Return 	: The value of the option or invalid_option
 %%		  [OptionValue | {bad_result, Reason}]
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option, Gstkid, TkW, DB,_) ->
-    case Option of
-	x             -> tcl2erl:ret_x(geo_str(TkW));
-	y             -> tcl2erl:ret_y(geo_str(TkW));
-	width         -> tcl2erl:ret_width(geo_str(TkW));
-	height        -> tcl2erl:ret_height(geo_str(TkW));
-	configure     -> gstk_db:opt(DB,Gstkid,configure);
-	bg            -> tcl2erl:ret_color([TkW," cg -bg"]);
-	map           -> tcl2erl:ret_mapped(["winfo is ", TkW]);
-	iconify       -> tcl2erl:ret_iconified(["wm st ", TkW]);
-	title         -> tcl2erl:ret_str(["wm ti ", TkW]);
-	iconname      -> tcl2erl:ret_str(["wm iconn ", TkW]);
-	iconbitmap    -> tcl2erl:ret_str(["wm iconb ", TkW]);
-	iconmask      -> tcl2erl:ret_str(["wm iconm ", TkW]);
-	setfocus      -> tcl2erl:ret_focus(TkW, "focus");
-	_ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(Option, Gstkid, TkW, DB, _) -> read_option(Option, Gstkid, TkW, DB).
+
+read_option(configure, Gstkid, _TkW, DB) -> gstk_db:opt(DB, Gstkid, configure);
+read_option(Option, Gstkid, TkW, _DB) ->
+    case read_option(Option, TkW) of
+	invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+	O -> O
     end.
 
-geo_str(TkW) ->
-    ["update idletasks;",?REGEXP,"[wm geometry ", TkW,
-     "] g w h x y;set tmp \"$w $h $x $y\""].
+read_option(x, TkW) -> tcl2erl:ret_x(geo_str(TkW));
+read_option(y, TkW) -> tcl2erl:ret_y(geo_str(TkW));
+read_option(width, TkW) -> tcl2erl:ret_width(geo_str(TkW));
+read_option(height, TkW) -> tcl2erl:ret_height(geo_str(TkW));
+read_option(bg, TkW) -> tcl2erl:ret_color([TkW, " cg -bg"]);
+read_option(map, TkW) -> tcl2erl:ret_mapped(["winfo is ", TkW]);
+read_option(iconify, TkW) -> tcl2erl:ret_iconified(["wm st ", TkW]);
+read_option(title, TkW) -> ret_str("wm ti ", TkW);
+read_option(iconname, TkW) -> ret_str("wm iconn ", TkW);
+read_option(iconbitmap, TkW) -> ret_str("wm iconb ", TkW);
+read_option(iconmask, TkW) -> ret_str("wm iconm ", TkW);
+read_option(setfocus, TkW) -> tcl2erl:ret_focus(TkW, "focus");
+read_option(_Option, _TkW) -> invalid_option.
 
+ret_str(Str, TkW) -> tcl2erl:ret_str([Str, TkW]).
 
+geo_str(TkW) -> ["update idletasks;", ?REGEXP, "[wm geometry ", TkW, "] g w h x y;set tmp \"$w $h $x $y\""].
 
 %%----------------------------------------------------------------------
 %%			       PRIMITIVES
 %%----------------------------------------------------------------------
 
-%% Return {+,-}Int  to be used in a geometry option
-signed(X) when X>=0 ->
-    [$+,integer_to_list(X)];
-signed(X) when X<0 ->
-    integer_to_list(X).
+%% Return {+, -}Int  to be used in a geometry option
+signed(X) when X >= 0 -> [$+|integer_to_list(X)];
+signed(X) when X < 0 -> integer_to_list(X).
 
 %%----------------------------------------------------------------------
 %% Purpose: tcl/tk: wm .window geo sets WxH+x+y at one time.
@@ -341,31 +314,20 @@ signed(X) when X<0 ->
 %%          possible in one operation.
 %%----------------------------------------------------------------------
 transform_geometry_opts(Opts) ->
-    {Geo,RestOpts} = collect_geo_opts(Opts,[],[]),
-    Geo2 = make_atomic(lists:sort(Geo)),
-    lists:append(Geo2,RestOpts).
+    {Geo, RestOpts} = collect_geo_opts(Opts, [], []),
+    lists:append(make_atomic(lists:sort(Geo)), RestOpts).
 
-make_atomic([{height,H},{width,W},{x,X},{y,Y}]) ->
-    [{width_height,{W,H}},{xy,{X,Y}}];
-make_atomic([{height,H},{width,W}|XY]) ->
-    [{width_height,{W,H}}|XY];
-make_atomic([WH,{x,X},{y,Y}]) ->
-    [WH,{xy,{X,Y}}];
+make_atomic([{height, H}, {width, W}, {x, X}, {y, Y}]) -> [{width_height, {W, H}}, {xy, {X, Y}}];
+make_atomic([{height, H}, {width, W}|XY]) -> [{width_height, {W, H}}|XY];
+make_atomic([WH, {x, X}, {y, Y}]) -> [WH, {xy, {X, Y}}];
 make_atomic(L) -> L.
 
 %%----------------------------------------------------------------------
-%% Returns: {(list of x,y,width,height options),list of other opts}
+%% Returns: {(list of x, y,width, height options), list of other opts}
 %%----------------------------------------------------------------------
-collect_geo_opts([{x,X}|Opts],Geo,Rest) ->
-    collect_geo_opts(Opts,[{x,X}|Geo],Rest);
-collect_geo_opts([{y,Y}|Opts],Geo,Rest) ->
-    collect_geo_opts(Opts,[{y,Y}|Geo],Rest);
-collect_geo_opts([{height,H}|Opts],Geo,Rest) ->
-    collect_geo_opts(Opts,[{height,H}|Geo],Rest);
-collect_geo_opts([{width,W}|Opts],Geo,Rest) ->
-    collect_geo_opts(Opts,[{width,W}|Geo],Rest);
-collect_geo_opts([Opt|Opts],Geo,Rest) ->
-    collect_geo_opts(Opts,Geo,[Opt|Rest]);
-collect_geo_opts([],Geo,Rest) -> {Geo,Rest}.
-    
+collect_geo_opts([{T, _} = Opt|Opts], Geo, Rest) when T =:= x; T =:= y; T =:= height; T =:= width->
+    collect_geo_opts(Opts, [Opt|Geo], Rest);
+collect_geo_opts([Opt|Opts], Geo, Rest) -> collect_geo_opts(Opts, Geo, [Opt|Rest]);
+collect_geo_opts([], Geo, Rest) -> {Geo, Rest}.
+
 %%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gs_widgets.erl otp_src_19.0.5-lib-gs/lib/gs/src/gs_widgets.erl
--- otp_src_19.0.5/lib/gs/src/gs_widgets.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gs_widgets.erl	2016-08-25 16:37:44.567693306 +0300
@@ -26,74 +26,53 @@
 
 -module(gs_widgets).
 
-
 %% ----- Exports -----
--export([default_options/1,
-	 container/1]).
-
+-export([default_options/1, container/1]).
 
 %% ------------------------------------------------------------
 %% default_options for widgets
 %% Keep the options in the list sorted!
 %% ------------------------------------------------------------
 
-default_options(arc)         -> [{coords, [{0,0}, {0,0}]}];
-default_options(button)      -> [{click,true}, {height,30}, {width,100}, {x,0},
-				{y,0}];
-default_options(canvas)      -> [{height,200}, {scrollregion,{0,0,300,200}},
-				 {width,300}, {x,0}, {y,0}];
-default_options(checkbutton) -> [{click,true}, {height,30}, {width,100}, {x,0},
-				 {y,0}];
-default_options(editor)      -> [{height,200}, {width,300}, {x,0}, {y,0}];
-default_options(entry)       -> [{height,30}, {width,100}, {x,0}, {y,0}];
-default_options(frame)       -> [{height,100}, {width,150}, {x,0}, {y,0}];
-default_options(grid)        -> [{bg,grey}, {cellheight,20},
-				 {columnwidths, [80,80,80,80]},
-				 {fg,black}, {font,{screen, 12}},
-				 {height,100},
-				 {hscroll,bottom},
-				 {rows,{1,10}},
-				 {vscroll,right},
-				 {width,300},
-		 		 {x,0}, {y,0}];
+default_options(arc) -> [{coords, [{0, 0}, {0, 0}]}];
+default_options(button) -> [{click, true}, {height, 30}, {width, 100}, {x, 0}, {y, 0}];
+default_options(canvas) -> [{height, 200}, {scrollregion, {0, 0, 300, 200}}, {width, 300}, {x, 0}, {y, 0}];
+default_options(checkbutton) -> [{click, true}, {height, 30}, {width, 100}, {x, 0}, {y, 0}];
+default_options(editor) -> [{height, 200}, {width, 300}, {x, 0}, {y, 0}];
+default_options(entry) -> [{height, 30}, {width, 100}, {x, 0}, {y, 0}];
+default_options(frame) -> [{height, 100}, {width, 150}, {x, 0}, {y, 0}];
+default_options(grid) -> [{bg, grey}, {fg, black},
+			  {cellheight, 20}, {columnwidths, [80, 80, 80, 80]},
+			  {font, {screen, 12}},
+			  {height, 100}, {width, 300},
+			  {hscroll, bottom}, {vscroll, right},
+			  {rows, {1, 10}},
+		 	  {x, 0}, {y, 0}];
 						           % Keep the options in the list sorted!
-default_options(gridline)    -> [{click,true}, {doubleclick,false}, {row,undefined}];
-default_options(gs)          -> [{kernel,false},
-				 {{default,all,font}, {screen,12}}];
-default_options(image)       -> [{anchor,nw}, {coords,[{0,0}]}];
-default_options(label)       -> [{height,30}, {width,100}, {x,0}, {y,0}];
-default_options(line)        -> [{coords, [{-1,-1},{-1,-1}]}];
-default_options(listbox)     -> [{height,130}, {hscroll,true},
-				 {selectmode,single}, {vscroll,true},
-				 {width,125}, {x,0}, {y,0}];
-default_options(menu)        -> [];
+default_options(gridline) -> [{click, true}, {doubleclick, false}, {row, undefined}];
+default_options(gs) -> [{kernel, false}, {{default, all, font}, {screen, 12}}];
+default_options(image) -> [{anchor, nw}, {coords, [{0, 0}]}];
+default_options(label) -> [{height, 30}, {width, 100}, {x, 0}, {y, 0}];
+default_options(line) -> [{coords, [{-1, -1}, {-1, -1}]}];
+default_options(listbox) ->
+    [{height, 130}, {hscroll, true}, {selectmode, single}, {vscroll, true}, {width, 125}, {x, 0}, {y, 0}];
+default_options(menu) -> [];
 						           % Keep the options in the list sorted!
-default_options(menubar)     -> [{bw,2}, {height,25}, {highlightbw,0},
-				 {relief,raised}];
-default_options(menubutton)  -> [{anchor,nw}, {side,left}];
-default_options(menuitem)    -> [{click,true}, {index,last}, {itemtype,normal}];
-default_options(message)     -> [{height,75}, {width,100}];
-default_options(oval)        -> [{coords, [{0,0},{0,0}]}];
-default_options(polygon)     -> [{coords, [{0,0},{0,0}]}, {fg,black}, {fill,none}];
-default_options(prompter)    -> [{height,200}, {prompt,[]}, {width,300}];
-default_options(radiobutton) -> [{click,true}, {height,30}, {width,100},
-				 {x,0}, {y,0}];
-default_options(rectangle)   -> [{coords, [{0,0},{0,0}]}];
-default_options(scale)       -> [{click,true}, {height,50}, {width,100},
-				 {x,0}, {y,0}];
+default_options(menubar) -> [{bw, 2}, {height, 25}, {highlightbw, 0}, {relief, raised}];
+default_options(menubutton) -> [{anchor, nw}, {side, left}];
+default_options(menuitem) -> [{click, true}, {index, last}, {itemtype, normal}];
+default_options(message) -> [{height, 75}, {width, 100}];
+default_options(oval) -> [{coords, [{0, 0}, {0, 0}]}];
+default_options(polygon) -> [{coords, [{0, 0}, {0, 0}]}, {fg, black}, {fill, none}];
+default_options(prompter) -> [{height, 200}, {prompt, []}, {width, 300}];
+default_options(radiobutton) -> [{click, true}, {height, 30}, {width, 100}, {x, 0}, {y, 0}];
+default_options(rectangle) -> [{coords, [{0, 0}, {0, 0}]}];
+default_options(scale) -> [{click, true}, {height, 50}, {width, 100}, {x, 0}, {y, 0}];
 						           % Keep the options in the list sorted!
-default_options(scrollbar)   -> [];
-default_options(text)        -> [{anchor,nw}, {coords,[{0,0}]}, {justify,left}];
-default_options(window)      -> [{configure,false}, {cursor,arrow}, {destroy,true},
-				 {height,200}, {map,false}, {width,300}];
-default_options(_)           -> [].
+default_options(scrollbar) -> [];
+default_options(text) -> [{anchor, nw}, {coords, [{0, 0}]}, {justify, left}];
+default_options(window) ->
+    [{configure, false}, {cursor, arrow}, {destroy, true}, {height, 200}, {map, false}, {width, 300}];
+default_options(_) -> [].
 
-container(canvas)      -> true;
-container(frame)       -> true;
-container(grid)        -> true;
-container(menu)        -> true;
-container(menubar)     -> true;
-container(menubutton)  -> true;
-container(menuitem)    -> true;
-container(window)      -> true;
-container(_)           -> false.
+container(C) -> lists:member(C, [canvas, frame, grid, menu, menubar, menubutton, menuitem, window]).
diff -Ndurp otp_src_19.0.5/lib/gs/src/Makefile otp_src_19.0.5-lib-gs/lib/gs/src/Makefile
--- otp_src_19.0.5/lib/gs/src/Makefile	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/Makefile	2016-08-25 16:37:44.567693306 +0300
@@ -73,7 +73,7 @@ IMAGES=../priv/bitmap/fup.bm
 # ----------------------------------------------------
 # FLAGS
 # ----------------------------------------------------
-ERL_COMPILE_FLAGS += +warn_obsolete_guard -Werror
+ERL_COMPILE_FLAGS += +inline +warn_obsolete_guard -Werror
 
 # ----------------------------------------------------
 # Targets
diff -Ndurp otp_src_19.0.5/lib/gs/src/tcl2erl.erl otp_src_19.0.5-lib-gs/lib/gs/src/tcl2erl.erl
--- otp_src_19.0.5/lib/gs/src/tcl2erl.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/tcl2erl.erl	2016-08-25 16:37:44.567693306 +0300
@@ -26,7 +26,8 @@
 %% ------------------------------------------------------------
 
 -module(tcl2erl).
--compile([{nowarn_deprecated_function,{gs,error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, error, 2}}]).
 
 -export([parse_event/1,
 	 ret_int/1,
@@ -53,8 +54,6 @@
 
 -include("gstk.hrl").
 
-
-
 %% ----------------------------------------
 %%  Parse an incoming event represented as
 %%  a list of bytes
@@ -66,18 +65,12 @@ parse_event(Bytes) ->
     {term_seq, Args}= parse_term_seq(Toks),
     {list_to_integer(ID), Etag, Args}.
 
+%%---first word returns {Word, Cont}---%%
+first_word(Bytes) -> fw(Bytes, []).
 
-%%---first word returns {Word,Cont}---%%
-first_word(Bytes) ->
-    fw(Bytes,[]).
-
-fw([],Ack) ->
-    {lists:reverse(Ack),[]};
-fw([$ |R],Ack) ->
-    {lists:reverse(Ack),R};
-fw([Char|R],Ack) ->
-    fw(R,[Char|Ack]).
-
+fw([], Ack) -> {lists:reverse(Ack), []};
+fw([$ |R], Ack) -> {lists:reverse(Ack), R};
+fw([Char|R], Ack) -> fw(R, [Char|Ack]).
 
 %% ---------------------------------------------
 %% str_to_term(Str)
@@ -91,13 +84,12 @@ fw([Char|R],Ack) ->
 %%
 
 str_to_term(Str) ->
-    {tokens,Tokens} = scan(Str),
+    {tokens, Tokens} = scan(Str),
     case catch parse_term(Tokens) of
-	{_Type, Term,[]} -> {term,Term};
+	{_Type, Term, []} -> {term, Term};
 	_ -> {string, Str}
     end.
 
-
 %% ---------------------------------------------
 %% Simple Parser.  ;-)
 %% Parses tokens or fails.
@@ -111,146 +103,88 @@ str_to_term(Str) ->
 %% parse_term_seq(Toks) <->   {term_seq, Term_Sequence}   %% no continuation
 %%
 
-parse_term([{var,Var}|R]) -> {var,Var,R};
-parse_term([{atom,Atom}|R]) -> {atom,Atom,R};
-parse_term([{float,Float}|R]) -> {float,Float,R};
-parse_term([{integer,Integer}|R]) -> {integer,Integer,R};
-parse_term([{string,String}|R]) -> {string,String,R};
-parse_term(['-',{integer,Integer}|R]) -> {integer,-Integer,R};
-parse_term(['-',{float,Float}|R]) -> {float,-Float,R};
-parse_term(['+',{integer,Integer}|R]) -> {integer,Integer,R};
-parse_term(['+',{float,Float}|R]) -> {float,Float,R};
-parse_term(['['|R]) -> {list,_Term,_C}=parse_list(['['|R]);
-parse_term(['{'|R]) -> {tuple,_Term,_C}=parse_tuple(['{'|R]);
-parse_term([Char|R]) -> {char,Char,R}.
+parse_term([{T, Val}|R]) when T =:= var; T =:= atom; T =:= flaot; T =:= integer; T =:= string -> {T, Val, R};
+parse_term(['-', {T, Val}|R]) when T =:= integer; T =:= float -> {T, -Val, R};
+parse_term(['+', {T, Val}|R]) when T =:= integer; T =:= float -> {T, Val, R};
+parse_term(['['|R]) -> {list, _Term, _C} = parse_list(['['|R]);
+parse_term(['{'|R]) -> {tuple, _Term, _C} = parse_tuple(['{'|R]);
+parse_term([Char|R]) -> {char, Char, R}.
 
 %%--- parse list ---
-parse_list(['[',']'|C]) ->
-    {list, [], C};
-parse_list(['['|R]) ->
-    {list,_List,_C}= list_args(R,[]).
+parse_list(['[', ']'|C]) -> {list, [], C};
+parse_list(['['|R]) -> {list, _List, _C} = list_args(R, []).
 
-list_args(Toks,Ack) ->
-    cont_list(parse_term(Toks),Ack).
+list_args(Toks, Ack) -> cont_list(parse_term(Toks), Ack).
 
-cont_list({_Tag, Term,[','|C]},Ack) ->
-    list_args(C,[Term|Ack]);
-cont_list({_Tag, Term,[']'|C]},Ack) ->
-    {list,lists:reverse([Term|Ack]),C}.
+cont_list({_Tag, Term, [','|C]}, Ack) -> list_args(C, [Term|Ack]);
+cont_list({_Tag, Term, [']'|C]}, Ack) -> {list, lists:reverse([Term|Ack]), C}.
 
 %%--- parse tuple ---
-parse_tuple(['{','}'|C]) ->
-    {tuple,{}, C};
-parse_tuple(['{'|R]) ->
-    {tuple,_Tuple,_C}=tuple_args(R,[]).
+parse_tuple(['{', '}'|C]) -> {tuple, {}, C};
+parse_tuple(['{'|R]) -> {tuple, _Tuple, _C} = tuple_args(R, []).
 
-tuple_args(Toks,Ack) ->
-    cont_tuple(parse_term(Toks),Ack).
+tuple_args(Toks, Ack) -> cont_tuple(parse_term(Toks), Ack).
 
-cont_tuple({_Tag, Term,[','|C]},Ack) ->
-    tuple_args(C,[Term|Ack]);
-cont_tuple({_Tag, Term,['}'|C]},Ack) ->
-    {tuple,list_to_tuple(lists:reverse([Term|Ack])),C}.
+cont_tuple({_Tag, Term, [','|C]}, Ack) -> tuple_args(C, [Term|Ack]);
+cont_tuple({_Tag, Term, ['}'|C]}, Ack) -> {tuple, list_to_tuple(lists:reverse([Term|Ack])), C}.
 
 %%--- parse sequence of terms ---
-parse_term_seq(Toks) ->
-    p_term_seq(Toks,[]).
-
-p_term_seq([],Ack) ->
-    {term_seq, lists:reverse(Ack)};    % never any continuation left 
-p_term_seq(Toks,Ack) ->
-    {_Type,Term,C} = parse_term(Toks),
-    p_term_seq(C,[Term|Ack]).
-
+parse_term_seq(Toks) -> p_term_seq(Toks, []).
 
+p_term_seq([], Ack) -> {term_seq, lists:reverse(Ack)}; % never any continuation left
+p_term_seq(Toks, Ack) ->
+    {_Type, Term, C} = parse_term(Toks),
+    p_term_seq(C, [Term|Ack]).
 
 %% ----------------------------------------
 %% Simple Scanner
 
-scan(Bytes) ->
-    {tokens, scan(Bytes,[])}.
-
-scan([],Ack) ->
-    lists:reverse(Ack);
-scan([$ |R],Ack) ->       % delete whitespace
-    scan(R,Ack);
-scan([X|R],Ack) when is_integer(X),X>=$a,X=<$z ->
-    scan_atom(R,[X],Ack);
-scan([X|R],Ack) when is_integer(X),X>=$A,X=<$Z ->
-    scan_var(R,[X],Ack);
-scan([X|R],Ack) when is_integer(X),X>=$0,X=<$9 ->
-    scan_number(R,[X],Ack);
-scan([$"|R],Ack) ->
-    scan_string(R,[],Ack);
-scan([X|R],Ack) when is_integer(X) ->
-    scan(R,[list_to_atom([X])|Ack]).
-
-scan_atom([X|R],Ack1,Ack2) when is_integer(X),X>=$a,X=<$z ->
-    scan_atom(R,[X|Ack1],Ack2);
-scan_atom([X|R],Ack1,Ack2) when is_integer(X),X>=$A,X=<$Z ->
-    scan_atom(R,[X|Ack1],Ack2);
-scan_atom([X|R],Ack1,Ack2) when is_integer(X),X>=$0,X=<$9 ->
-    scan_atom(R,[X|Ack1],Ack2);
-scan_atom([$_|R],Ack1,Ack2) ->
-    scan_atom(R,[$_|Ack1],Ack2);
-scan_atom(L,Ack1,Ack2) ->
-    scan(L,[{atom,list_to_atom(lists:reverse(Ack1))}|Ack2]).
+scan(Bytes) -> {tokens, scan(Bytes, [])}.
 
-scan_var([X|R],Ack1,Ack2) when is_integer(X),X>=$a,X=<$z ->
-    scan_var(R,[X|Ack1],Ack2);
-scan_var([X|R],Ack1,Ack2) when is_integer(X),X>=$A,X=<$Z ->
-    scan_var(R,[X|Ack1],Ack2);
-scan_var([X|R],Ack1,Ack2) when is_integer(X),X>=$0,X=<$9 ->
-    scan_var(R,[X|Ack1],Ack2);
-scan_var([$_|R],Ack1,Ack2) ->
-    scan_var(R,[$_|Ack1],Ack2);
-scan_var(L,Ack1,Ack2) ->
-    scan(L,[{var,list_to_atom(lists:reverse(Ack1))}|Ack2]).
+scan([], Ack) -> lists:reverse(Ack);
+scan([$ |R], Ack) -> scan(R, Ack); % delete whitespace
+scan([X|R], Ack) when X >= $a, X =< $z -> scan_atom(R, [X], Ack);
+scan([X|R], Ack) when X >= $A, X =< $Z -> scan_var(R, [X], Ack);
+scan([X|R], Ack) when X >= $0, X =< $9 -> scan_number(R, [X], Ack);
+scan([$"|R], Ack) -> scan_string(R, [], Ack);
+scan([X|R], Ack) when is_integer(X) -> scan(R, [list_to_atom([X])|Ack]).
 
-scan_number([X|R],Ack1,Ack2) when is_integer(X),X>=$0,X=<$9 ->
-    scan_number(R,[X|Ack1],Ack2);
-scan_number([$.|R],Ack1,Ack2) ->
-    scan_float(R,[$.|Ack1],Ack2);
-scan_number(L,Ack1,Ack2) ->
-    scan(L,[{integer,list_to_integer(lists:reverse(Ack1))}|Ack2]).
+scan_term(T, [X|R], Ack1, Ack2) when X >= $a andalso X =< $z; X >= $A andalso X =< $Z; X >= $0 andalso X =< $9 ->
+    scan_term(T, R, [X|Ack1], Ack2);
+scan_term(T, [$_|R], Ack1, Ack2) -> scan_term(T, R, [$_|Ack1], Ack2);
+scan_term(T, L, Ack1, Ack2) -> scan(L, [{T, list_to_atom(lists:reverse(Ack1))}|Ack2]).
 
-scan_float([X|R],Ack1,Ack2) when is_integer(X),X>=$0,X=<$9 ->
-    scan_float(R,[X|Ack1],Ack2);
-scan_float(L,Ack1,Ack2) ->
-    Float = list_to_float(lists:reverse(Ack1)),
-    Int = trunc(Float),
-    if
-	Int==Float ->
-	    scan(L,[{integer,Int}|Ack2]);
-	true ->
-	    scan(L,[{float,Float}|Ack2])
-    end.
+scan_atom(L, Ack1, Ack2) -> scan_term(atom, L, Ack1, Ack2).
 
+scan_var(L, Ack1, Ack2) -> scan_term(var, L, Ack1, Ack2).
 
-scan_string([$"|R],Ack1,Ack2) ->
-    scan(R,[{string,lists:reverse(Ack1)}|Ack2]);
-scan_string([X|R],Ack1,Ack2) when is_integer(X) ->
-    scan_string(R,[X|Ack1],Ack2);
-scan_string([],_Ack1,_Ack2) ->
-    throw({error,"unterminated string."}).
+scan_number([X|R], Ack1, Ack2) when X >= $0, X =< $9 -> scan_number(R, [X|Ack1], Ack2);
+scan_number([$.|R], Ack1, Ack2) -> scan_float(R, [$.|Ack1], Ack2);
+scan_number(L, Ack1, Ack2) -> scan(L, [{integer, list_to_integer(lists:reverse(Ack1))}|Ack2]).
 
+scan_float([X|R], Ack1, Ack2) when X >= $0, X =< $9 -> scan_float(R, [X|Ack1], Ack2);
+scan_float(L, Ack1, Ack2) ->
+    Float = list_to_float(lists:reverse(Ack1)),
+    scan(L, [case trunc(Float) of
+		 Int when Int == Float -> {integer, Int};
+		 _ -> {float, Float}
+	     end|Ack2]).
 
+scan_string([$"|R], Ack1, Ack2) -> scan(R, [{string, lists:reverse(Ack1)}|Ack2]);
+scan_string([X|R], Ack1, Ack2) when is_integer(X) -> scan_string(R, [X|Ack1], Ack2);
+scan_string([], _Ack1, _Ack2) -> throw({error, "unterminated string."}).
 
 %% ---------- Checking Return values -----------
 %% Used by read to return a proper type or fail.
 
-ret_int(Str) ->
-    case gstk:call(Str) of
-	{result, Result} ->
-	    {_,Value} = str_to_term(Result),
-	    Value;
-	Bad_result -> Bad_result
-    end.
+ret_int(Str) -> ret_term(Str).
 
-ret_atom(Str) ->
+ret_atom(Str) -> ret_term(Str).
+
+ret_term(Str) ->
     case gstk:call(Str) of
 	{result, Result} ->
-	    {_,Value} = str_to_term(Result),
+	    {_, Value} = str_to_term(Result),
 	    Value;
 	Bad_result -> Bad_result
     end.
@@ -263,9 +197,9 @@ ret_str(Str) ->
 
 ret_tuple(Str) ->
     case gstk:call(Str) of
-	{result,S} ->
-	    {tokens,Toks} = scan(S),
-	    {term_seq,Seq} = parse_term_seq(Toks),
+	{result, S} ->
+	    {tokens, Toks} = scan(S),
+	    {term_seq, Seq} = parse_term_seq(Toks),
 	    list_to_tuple(Seq);
 	Bad_result -> Bad_result
     end.
@@ -273,187 +207,158 @@ ret_tuple(Str) ->
 %%----------------------------------------------------------------------
 %% Returns: Coords or error.
 %%----------------------------------------------------------------------
-ret_pack(Key, TkW) ->
-    Str = ret_list(["pack info ", TkW]),
-    pick_out(Str, Key).
+ret_pack(Key, TkW) -> pick_out(ret_list(["pack info ", TkW]), Key).
 
-ret_place(Key, TkW) ->
-    Str = ret_list(["place info ", TkW]),
-    pick_out(Str, Key).
+ret_place(Key, TkW) -> pick_out(ret_list(["place info ", TkW]), Key).
 
-pick_out([Key, Value | _Rest], Key) -> Value;
-pick_out([Key, {} | _Rest], Key)    -> 0;
-pick_out(['-' | Rest], Key)        -> pick_out(Rest, Key);
-pick_out([_, _ | Rest], Key)       -> pick_out(Rest, Key);
+pick_out([Key, Value|_Rest], Key) -> Value;
+pick_out([Key, {}|_Rest], Key) -> 0;
+pick_out(['-'|Rest], Key) -> pick_out(Rest, Key);
+pick_out([_, _|Rest], Key) -> pick_out(Rest, Key);
 pick_out(Other, _Key) -> Other.
 
-
 ret_x(Str) ->
     case ret_geometry(Str) of
-	{_W,_H,X,_Y} -> X;
+	{_W, _H, X, _Y} -> X;
 	Other -> Other
     end.
 
 ret_y(Str) ->
     case ret_geometry(Str) of
-	{_W,_H,_X,Y} -> Y;
+	{_W, _H, _X, Y} -> Y;
 	Other -> Other
     end.
 
 ret_width(Str) ->
     case ret_geometry(Str) of
-	{W,_H,_X,_Y} -> W;
+	{W, _H, _X, _Y} -> W;
 	Other -> Other
     end.
 
 ret_height(Str) ->
     case ret_geometry(Str) of
-	{_W,H,_X,_Y} -> H;
+	{_W, H, _X, _Y} -> H;
 	Other -> Other
     end.
 
-
-
 ret_geometry(Str) ->
     case ret_tuple(Str) of
-	{W,H,X,Y} when is_atom(H) ->
-	    [_|Height]=atom_to_list(H),
-	    {W,list_to_integer(Height),X,Y};
+	{W, H, X, Y} when is_atom(H) -> {W, list_to_integer(tl(atom_to_list(H))), X, Y};
 	Other -> Other
     end.
 
 ret_list(Str) ->
     case gstk:call(Str) of
-	{result,S} ->
-	    {tokens,Toks} = scan(S),
-	    {term_seq,Seq} = parse_term_seq(Toks),
+	{result, S} ->
+	    {tokens, Toks} = scan(S),
+	    {term_seq, Seq} = parse_term_seq(Toks),
 	    Seq;
 	Bad_result -> Bad_result
     end.
 
 ret_str_list(Str) ->
     case gstk:call(Str) of
-	{result,S} ->
-	    mk_quotes0(S,[]);
+	{result, S} -> mk_quotes0(S, []);
 	Bad_result -> Bad_result
     end.
 
-
 ret_label(Str) ->
     case ret_str_list(Str) of
 	[[], [$@|Img]] -> {image, Img};
-	[Text, []]     -> {text, Text};
-	Bad_Result     -> Bad_Result
-    end.
-
-
-	
-ret_mapped(Str) ->
-    case ret_int(Str) of
-	1     -> true;
-	0     -> false;
+	[Text, []] -> {text, Text};
 	Bad_Result -> Bad_Result
     end.
 
+ret_mapped(Str) -> ret_bool(Str).
 
 ret_iconified(Str) ->
     case ret_atom(Str) of
-	iconic     -> true;
-	normal     -> false;
+	iconic -> true;
+	normal -> false;
 	Bad_Result -> Bad_Result
     end.
 
-
-ret_focus(W, Str) ->
-    case gstk:call(Str) of
-	{result, W} -> true;
-	_           -> false
-    end.
-
+ret_focus(W, Str) -> gstk:call(Str) =:= {result, W}.
 
 ret_file(Str) ->
     case gstk:call(Str) of
 	{result, [$@|File]} -> File;
-	{result, []}        -> [];
-	Bad_result          -> Bad_result
+	{result, []} -> [];
+	Bad_result -> Bad_result
     end.
 
-
 ret_bool(Str) ->
     case ret_int(Str) of
-	1     -> true;
-	0     -> false;
+	1 -> true;
+	0 -> false;
 	Bad_Result -> Bad_Result
     end.
 
 ret_enable(Str) ->
     case ret_atom(Str) of
-	normal     -> true;
-	active     -> true;
-	disabled   -> false;
+	normal -> true;
+	active -> true;
+	disabled -> false;
 	Bad_Result -> Bad_Result
     end.
 
-
-
 ret_color(Str) ->
     case gstk:call(Str) of
-	{result,[$#,R1,G1,B1]} ->
-	    {hex2dec([R1,$0]),hex2dec([G1,$0]),hex2dec([B1,$0])};
-	{result,[$#,R1,R2,G1,G2,B1,B2]} ->
-	    {hex2dec([R1,R2]),hex2dec([G1,G2]),hex2dec([B1,B2])};
-	{result,[$#,R1,R2,_R3,G1,G2,_G3,B1,B2,_B3]} ->
-	    {hex2dec([R1,R2]),hex2dec([G1,G2]),hex2dec([B1,B2])};
-	{result,[$#,R1,R2,_R3,_R4,G1,G2,_G3,_G4,B1,B2,_B3,_B4]} ->
-	    {hex2dec([R1,R2]),hex2dec([G1,G2]),hex2dec([B1,B2])};
-	{result,[Char|Word]} when Char>=$A, Char=<$Z ->
-	    list_to_atom([Char+32|Word]);
-	{result,[Char|Word]} when Char>=$a, Char=<$z ->
-	    list_to_atom([Char|Word]);
-	{result,Color} ->
-	    gs:error("error in tcl2erl:ret_color got ~w.~n",[Color]);
+	{result, [$#|L]} when length(L) =:= 3; length(L) =:= 6; length(L) =:= 9 ->
+	    list_to_tuple(lists:map(fun hex2dec/1,
+				    case L of
+					[R1, G1, B1] -> {[R1, $0], [G1, $0], [B1, $0]};
+					[R1, R2, G1, G2, B1, B2] -> {[R1, R2], [G1, G2], [B1, B2]};
+					[R1, R2, _R3, _R4, G1, G2, _G3, _G4, B1, B2, _B3, _B4] ->
+					    {[R1, R2], [G1, G2], [B1, B2]}
+				    end));
+	{result, [Char|Word]} when Char >= $A andalso Char =< $Z; Char >= $a andalso Char =< $z ->
+	    list_to_atom([Char bor 32|Word]);
+	{result, Color} -> gs:error("error in tcl2erl:ret_color got ~w.~n", [Color]);
 	Bad_result -> Bad_result
     end.
 
-
 ret_stipple(Str) ->
     case gstk:call(Str) of
 	{result, _Any} -> true;
 	_Other -> false
     end.
 
-
 %% ------------------------------------------------------------
 %% Hexadecimal to Decimal converter
 %%
 
-hex2dec(Hex) -> hex2dec(Hex,0).
-
-hex2dec([H|T],N) when H>=$0,H=<$9 ->
-    hex2dec(T,(N bsl 4) bor (H-$0));
-hex2dec([H|T],N) when H>=$a,H=<$f ->
-    hex2dec(T,(N bsl 4) bor (H-$a+10));
-hex2dec([H|T],N) when H>=$A,H=<$F ->
-    hex2dec(T,(N bsl 4) bor (H-$A+10));
-hex2dec([],N) -> N.
+hex2dec(Hex) -> hex2dec(Hex, 0).
 
+hex2dec([H|T], N) ->
+    hex2dec(T, (N bsl 4) bor (H - if
+				      H >= $0, H =< $9 -> $0;
+				      H >= $a, H =< $f -> $a - 10;
+				      H >= $A, H =< $F -> $A - 10
+				  end));
+hex2dec([], N) -> N.
 
-mk_quotes0([${|T],Res) -> mk_quotes2(T,"",Res);
-mk_quotes0([$ |T],Res) -> mk_quotes0(T,Res);
-mk_quotes0([$\\,X |T],Res) -> mk_quotes1(T,[X],Res);
-mk_quotes0([X|T],Res)  -> mk_quotes1(T,[X],Res);
-mk_quotes0([],Res)     -> lists:reverse(Res).
+mk_quotes0([${|T], Res) -> mk_quotes2(T, "", Res);
+mk_quotes0([$ |T], Res) -> mk_quotes0(T, Res);
+mk_quotes0([], Res) -> lists:reverse(Res);
+mk_quotes0(L, Res) ->
+    [X|T] = case L of
+		[$\\|[_|_] = R] -> R;
+		[_|_] -> L
+	    end,
+    mk_quotes1(T, [X], Res).
 
-mk_quotes1([$}|T],Ack,Res) -> mk_quotes0(T,[lists:reverse(Ack)|Res]);
-mk_quotes1([$\\,X |T],Ack,Res) -> mk_quotes1(T,[X|Ack],Res);
-mk_quotes1([$ |T],Ack,Res) -> mk_quotes0(T,[lists:reverse(Ack)|Res]);
-mk_quotes1([X|T],Ack,Res)  -> mk_quotes1(T,[X|Ack],Res);
-mk_quotes1([],Ack,Res)     -> lists:reverse([lists:reverse(Ack)|Res]).
+mk_quotes1([], Ack, Res) -> lists:reverse([lists:reverse(Ack)|Res]);
+mk_quotes1([X|T], Ack, Res) when X =:= $}; X =:= $  -> mk_quotes0(T, [lists:reverse(Ack)|Res]);
+mk_quotes1(L, Ack, Res) ->
+    [X|T] = case L of
+		[$\\|[_|_] = R] -> R;
+		[_|_] -> L
+	    end,
+    mk_quotes1(T, [X|Ack], Res).
 
 %% grouped using {bla bla} syntax
-mk_quotes2([$}|T],Ack,Res) -> mk_quotes0(T,[lists:reverse(Ack)|Res]);
-mk_quotes2([$\\,X |T],Ack,Res) -> mk_quotes2(T,[X|Ack],Res);
-mk_quotes2([X|T],Ack,Res)  -> mk_quotes2(T,[X|Ack],Res);
-mk_quotes2([],Ack,Res)     -> lists:reverse([lists:reverse(Ack)|Res]).
-
-
+mk_quotes2([$}|T], Ack, Res) -> mk_quotes0(T, [lists:reverse(Ack)|Res]);
+mk_quotes2([$\\, X|T], Ack, Res) -> mk_quotes2(T, [X|Ack], Res);
+mk_quotes2([X|T], Ack, Res) -> mk_quotes2(T, [X|Ack], Res);
+mk_quotes2([], Ack, Res) -> lists:reverse([lists:reverse(Ack)|Res]).
diff -Ndurp otp_src_19.0.5/lib/gs/src/tool_file_dialog.erl otp_src_19.0.5-lib-gs/lib/gs/src/tool_file_dialog.erl
--- otp_src_19.0.5/lib/gs/src/tool_file_dialog.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/tool_file_dialog.erl	2016-08-25 16:37:44.567693306 +0300
@@ -20,15 +20,16 @@
 
 %%
 -module(tool_file_dialog).
--compile([{nowarn_deprecated_function,{gs,button,3}},
-          {nowarn_deprecated_function,{gs,config,2}},
-          {nowarn_deprecated_function,{gs,entry,3}},
-          {nowarn_deprecated_function,{gs,frame,3}},
-          {nowarn_deprecated_function,{gs,label,3}},
-          {nowarn_deprecated_function,{gs,listbox,3}},
-          {nowarn_deprecated_function,{gs,read,2}},
-          {nowarn_deprecated_function,{gs,start,0}},
-          {nowarn_deprecated_function,{gs,window,3}}]).
+
+-compile([{nowarn_deprecated_function, {gs, button, 3}},
+          {nowarn_deprecated_function, {gs, config, 2}},
+          {nowarn_deprecated_function, {gs, entry, 3}},
+          {nowarn_deprecated_function, {gs, frame, 3}},
+          {nowarn_deprecated_function, {gs, label, 3}},
+          {nowarn_deprecated_function, {gs, listbox, 3}},
+          {nowarn_deprecated_function, {gs, read, 2}},
+          {nowarn_deprecated_function, {gs, start, 0}},
+          {nowarn_deprecated_function, {gs, window, 3}}]).
 
 -export([start/1]).
 
@@ -38,12 +39,12 @@
 	       extensions,    % [string()]  Filtered file extensions
 	       hidden}).      % [{Dir, [File]}]  Hidden files per dir.
 
--define(WIDTH,  250).
+-define(WIDTH, 250).
 -define(HEIGHT, 400).
--define(BTNW,   65).
--define(BTNH,   30).
+-define(BTNW, 65).
+-define(BTNH, 30).
 
-%% start(Opts) -> {ok, AbsFile, Dir} | {error,cancel} | pid()
+%% start(Opts) -> {ok, AbsFile, Dir} | {error, cancel} | pid()
 %%   Opts = [Opt]
 %%     Opt = {type, open|save|multiselect}
 %%         | {extensions, [string()]}  % For example ".erl"
@@ -51,7 +52,7 @@
 %%         ! {file, string()           % Filename (no path)
 %%   AbsFile = string()
 %%   Dir = string()
-%% An open/save dialog returns {ok, AbsFile, Dir} or {error,cancel}
+%% An open/save dialog returns {ok, AbsFile, Dir} or {error, cancel}
 %% (the latter, ridiculous, return value is kept for backwards
 %%  compatibility reasons only).
 %%
@@ -62,167 +63,114 @@
 %% a new filedialog with the same directory.
 
 start(Opts0) ->
-    Opts = parse_opts(Opts0),
     Self = self(),
-    case Opts#opts.type of
-	multiselect ->
-	    spawn_link(fun() -> init(Self, Opts) end);
-	_Type -> % open | save
-	    spawn_link(fun() -> init(Self, Opts) end),
-	    receive
-		{fd_result, Res} ->
-		    Res
-	    end
+    #opts{type = Type} = Opts = parse_opts(Opts0),
+    Pid = spawn_link(fun() -> init(Self, Opts) end),
+    if
+	Type =:= multiselect -> Pid;
+	true -> receive
+		    {fd_result, Res} -> Res
+		end
     end.
 
 parse_opts(Opts) ->
     {ok, CWD} = file:get_cwd(),
-    DefOpts = #opts{type=open, dir=CWD, file="NoName",
-		    extensions=[], hidden=[]},
-    parse_opts(Opts, DefOpts).
+    parse_opts(Opts, #opts{type = open, dir = CWD, file="NoName", extensions = [], hidden = []}).
 
-parse_opts([{type, Type}|Opts], DefOpts) ->
-    if
-	Type==open; Type==save; Type==multiselect ->
-	    parse_opts(Opts, DefOpts#opts{type=Type});
-	true ->
-	    erlang:error(badarg, [{type,Type}])
-    end;
-parse_opts([{extensions, Exts}|Opts], DefOpts) ->
-    case lists:all(fun(Ext) -> is_list(Ext) end, Exts) of
-	true ->
-	    parse_opts(Opts, DefOpts#opts{extensions=Exts});
-	false ->
-	    erlang:error(badarg, [{extension, Exts}])
-    end;
-parse_opts([{dir, Dir}|Opts], DefOpts) ->
-    case filelib:is_dir(Dir) of
-	true ->
-	    case filename:pathtype(Dir) of
-		absolute ->
-		    parse_opts(Opts, DefOpts#opts{dir=Dir});
-		_ ->
-		    parse_opts(Opts,
-			       DefOpts#opts{dir=filename:absname(Dir)})
-	    end;
-	false ->
-	    erlang:error(badarg, [{dir, Dir}])
-    end;
-parse_opts([{file, Name}|Opts], DefOpts) ->
-    if
-	is_list(Name) ->
-	    parse_opts(Opts, DefOpts#opts{file=Name});
-	true ->
-	    erlang:error(badarg, [{file, Name}])
-    end;
-parse_opts([_|Opts], DefOpts) -> % ignore unknown options
-    parse_opts(Opts, DefOpts);
-parse_opts([], DefOpts) ->
-    DefOpts.
+parse_opts([{type, Type} = T|Opts], DefOpts) ->
+    lists:member(Type, [open, save, multiselect]) orelse erlang:error(badarg, [T]),
+    parse_opts(Opts, DefOpts#opts{type = Type});
+parse_opts([{extensions, Exts} = E|Opts], DefOpts) ->
+    lists:all(fun is_list/1, Exts) orelse erlang:error(badarg, [E]),
+    parse_opts(Opts, DefOpts#opts{extensions = Exts});
+parse_opts([{dir, Dir} = D|Opts], DefOpts) ->
+    filelib:is_dir(Dir) orelse erlang:error(badarg, [D]),
+    parse_opts(Opts, DefOpts#opts{dir = case filename:pathtype(Dir) of
+					    absolute -> Dir;
+					    _ -> filename:absname(Dir)
+					end});
+parse_opts([Opt|Opts], DefOpts) ->
+    parse_opts(Opts, case Opt of
+			 {file, Name} -> if
+					     is_list(Name) -> DefOpts#opts{file = Name};
+					     true -> erlang:error(badarg, [Opt])
+					 end;
+			 _ -> DefOpts % ignore unknown options
+		     end);
+parse_opts([], DefOpts) -> DefOpts.
 
 %%--Loop----------------------------------------------------------------
 
 init(From, Opts) ->
     make_window(Opts),
-    loop(From, {?WIDTH,?HEIGHT}, Opts).
+    loop(From, {?WIDTH, ?HEIGHT}, Opts).
 
-loop(From, {OldW,OldH}=Size, Opts) ->
+loop(From, {_OldW, _OldH} = Size, #opts{dir = Dir} = Opts) ->
     receive
-
 	%% Window is closed
-	{gs, win, destroy, _, _} when Opts#opts.type==multiselect ->
-	    From ! {close, Opts#opts.dir};
-	{gs, win, destroy, _, _} ->
-	    From ! {fd_result, {error, cancel}};
-
+	{gs, win, destroy, _, _} -> From ! if
+					       Opts#opts.type =:= multiselect -> {close, Dir};
+					       true -> {fd_result, {error, cancel}}
+					   end;
 	%% Window is moved or resized
-	{gs, win, configure, _, [OldW,OldH|_]} ->
-	    loop(From, Size, Opts);
-	{gs, win, configure, _, [W,H|_]} ->
-	    gs:config(resizer, [{width,W},{height,H}]),
-	    loop(From, {W,H}, Opts);
-
+	{gs, win, configure, _, [W, H|_]} ->
+	     WH = {W, H},
+	     WH =:= Size orelse gs:config(resizer, [{width, W}, {height, H}]),
+	     loop(From, WH, Opts);
 	%% Up button is selected
-	{gs, up, click, _, _} ->
-	    Opts2 = set_dir(up, Opts),
-	    loop(From, Size, Opts2);
-
+	{gs, up, click, _, _} -> loop(From, Size, set_dir(up, Opts));
 	%% A listbox item (dir or file) is selected
-	{gs, lb, click, _, [_I,Item|_]} ->
-	    Entry = case lists:last(Item) of
-			$/ -> "";
-			_Ch -> Item
-		    end,
-	    gs:config(entry, {text,Entry}),
+	{gs, lb, click, _, [_I, Item|_]} ->
+	    gs:config(entry, {text, case lists:last(Item) of
+					$/ -> "";
+					_Ch -> Item
+				    end}),
 	    loop(From, Size, Opts);
-
 	%% A listbox item (dir or file) is double-clicked
-	{gs, lb, doubleclick, _, [_I,Item|_]} ->
-	    case lists:last(Item) of
-		$/ ->  do_select({dir, Item}, From, Size, Opts);
-		_Ch -> do_select({file, Item}, From, Size, Opts)
-	    end;
-
+	{gs, lb, doubleclick, _, [_I, Item|_]} -> do_select({case lists:last(Item) of
+								 $/ -> dir;
+								 _Ch -> file
+							     end, Item}, From, Size, Opts);
 	%% Open/Save/Select button is selected
 	{gs, select, click, _, _} ->
 	    case gs:read(entry, text) of
-		"" ->
-		    case gs:read(lb, selection) of
-			[] ->
-			    gs:config(select, beep),
-			    loop(From, Size, Opts);
-			[I] ->
-			    Item = gs:read(lb, {get,I}),
-			    case lists:last(Item) of
-				$/ ->
-				    do_select({dir, Item},
-					      From, Size, Opts);
-				_Ch ->
-				    do_select({file, Item},
-					      From, Size, Opts)
-			    end
-		    end;
+		"" -> case gs:read(lb, selection) of
+			  [] ->
+			      gs:config(select, beep),
+			      loop(From, Size, Opts);
+			  [I] ->
+			      Item = gs:read(lb, {get, I}),
+			      do_select({case lists:last(Item) of
+					     $/ -> dir;
+					     _Ch -> file
+					 end, Item}, From, Size, Opts)
+		      end;
 		Item -> do_select(Item, From, Size, Opts)
 	    end;
-			   
 	%% 'Return' is pressed
-	{gs, entry, keypress, _, ['Return'|_]} ->
-	    case gs:read(entry, text) of
-		"" ->
-		    gs:config(select, beep),
-		    loop(From, Size, Opts);
-		Item ->
-		    do_select(Item, From, Size, Opts)
-	    end;
-
+	{gs, entry, keypress, _, ['Return'|_]} -> case gs:read(entry, text) of
+						      "" ->
+							  gs:config(select, beep),
+							  loop(From, Size, Opts);
+						      Item -> do_select(Item, From, Size, Opts)
+						  end;
 	%% All button is selected (multiselect dialog)
 	{gs, all, click, _, _} ->
 	    {_Dirs, Files} = select_all(),
-	    lists:foreach(fun(File) ->
-				  AbsFile = filename:join(Opts#opts.dir,
-							  File),
-				  From ! {select, AbsFile}
-			  end,
-			  Files),
-	    From ! {close, Opts#opts.dir};
-
+	    lists:foreach(fun(File) -> From ! {select, filename:join(Dir, File)} end, Files),
+	    From ! {close, Dir};
 	%% Cancel button is selected (open/save dialog)
-	{gs, cancel, click, _, _} ->
-	    From ! {fd_result, {error, cancel}};
-
+	{gs, cancel, click, _, _} -> From ! {fd_result, {error, cancel}};
 	%% Close button is selected (multiselect dialog)
-	{gs, close, click, _, _} ->
-	    From ! {close, Opts#opts.dir};
-
+	{gs, close, click, _, _} -> From ! {close, Dir};
 	Msg ->
-	    io:format("GOT: ~p~n", [Msg]),
+	    io:format(standard_error, "GOT: ~p~n", [Msg]),
 	    loop(From, Size, Opts)
     end.
 
-do_select({dir, Name}, From, Size, Opts) ->
-    do_select_dir(filename:join(Opts#opts.dir, Name), From, Size, Opts);
-do_select({file, Name}, From, Size, Opts) ->
-    do_select_file(filename:join(Opts#opts.dir, Name), From, Size,Opts);
+do_select({dir, Name}, From, Size, #opts{dir = Dir} = Opts) -> do_select_dir(filename:join(Dir, Name), From, Size, Opts);
+do_select({file, Name}, From, Size, #opts{dir = Dir} = Opts) ->
+    do_select_file(filename:join(Dir, Name), From, Size, Opts);
 do_select(Entry, From, Size, Opts) ->
     AbsName = case filename:pathtype(Entry) of
 		  absolute -> Entry;
@@ -232,30 +180,20 @@ do_select(Entry, From, Size, Opts) ->
 	true -> do_select_dir(AbsName, From, Size, Opts);
 	false -> do_select_file(AbsName, From, Size, Opts)
     end.
-	    
-do_select_dir(Dir, From, Size, Opts) ->
-    Opts2 = set_dir(Dir, Opts),
-    loop(From, Size, Opts2).
 
-do_select_file(File, From, Size, Opts) ->
+do_select_dir(Dir, From, Size, Opts) -> loop(From, Size, set_dir(Dir, Opts)).
+
+do_select_file(File, From, Size, #opts{type = Type} = Opts) ->
     case filelib:is_file(File) of
-	true when Opts#opts.type==multiselect ->
+	true when Type =:= multiselect ->
 	    From ! {select, File},
-	    Opts2 = update(File, Opts),
-	    loop(From, Size, Opts2);
-	true -> % open | save
-	    From ! {fd_result, {ok, File, Opts#opts.dir}};
-	false when Opts#opts.type==save ->
-	    case filelib:is_dir(filename:dirname(File)) of
-		true ->
-		    From ! {fd_result, {ok, File, Opts#opts.dir}};
-		false ->
-		    gs:config(select, beep),
-		    loop(From, Size, Opts)
-	    end;
-	false -> % multiselect | open
-	    gs:config(select, beep),
-	    loop(From, Size, Opts)
+	    loop(From, Size, update(File, Opts));
+	R -> case R orelse (Type =:= save andalso filelib:is_dir(filename:dirname(File))) of
+		 true -> From ! {fd_result, {ok, File, Opts#opts.dir}};
+		 _ ->
+		     gs:config(select, beep),
+		     loop(From, Size, Opts)
+	     end
     end.
 
 %%--Common GUI functions------------------------------------------------
@@ -263,194 +201,128 @@ do_select_file(File, From, Size, Opts) -
 -define(UPW, 35).
 -define(UPH, 30).
 -define(ENTRYH, 30).
+-define(MARG, {fixed, 5}).
 
-make_window(Opts) ->
+make_window(#opts{type = Type, dir = Dir} = Opts) ->
     GS = gs:start(),
-
-    Title = case Opts#opts.type of
-		open -> "Open File";
-		save -> "Save File";
-		multiselect -> "Select Files"
-	    end,
-
-    Font = case gs:read(GS, {choose_font,{screen,[],12}}) of
-	       Font0 when element(1, Font0)==screen ->
-		   Font0;
-	       _ ->
-		   gs:read(GS, {choose_font,{courier,[],12}})
-	   end,
-
-    gs:window(win, GS, [{title,Title},
-			{width,?WIDTH}, {height,?HEIGHT},
-			{configure,true}]),
-
-    Marg = {fixed,5},
-    Parent = gs:frame(resizer, win, [{packer_x,[Marg,{stretch,1},Marg]},
-				     {packer_y,[Marg,
-						{stretch,10},
-						{stretch,1,2*?BTNH},
-						Marg]}]),
-    gs:frame(btnframe, resizer, [{packer_x, [{stretch,1},
-					     {fixed,?BTNW},
-					     {stretch,1},
-					     {fixed,?BTNW},
-					     {stretch,1},
-					     {fixed,?BTNW},
-					     {stretch,1}]},
-				 {packer_y, [{stretch,1},
-					     {fixed,?BTNH},
-					     {stretch,1}]},
-				 {pack_x,2}, {pack_y,3}]),
-
-    gs:frame(frame, Parent, [{packer_x,[{fixed,?UPW},{stretch,1}]},
-			     {packer_y,[{fixed,?UPH},{fixed,?ENTRYH},
-					{stretch,1}]},
-			     {pack_x,2}, {pack_y,2}]),
-
-    Fup = filename:join([code:priv_dir(gs),"bitmap","fup.bm"]),
-    gs:button(up, frame, [{label,{image, Fup}},
-			  {pack_x,1}, {pack_y,1}]),
-    gs:label(infodir, frame, [{label,{text," Dir:"}}, {font,Font},
-			      {pack_x,2}, {pack_y,1}, {align,w}]),
-    gs:label(l1, frame, [{label,{text,"File:"}}, {font,Font}, {align,e},
-			 {pack_x,1}, {pack_y,2}]),
-
-    gs:entry(entry, frame, [{font,Font}, {keypress,true},
-			    {pack_x,2}, {pack_y,2}]),
-    gs:listbox(lb, frame, [{font,Font}, {pack_x,{1,2}}, {pack_y,3},
-			   {selectmode,single},
-			   {vscroll,right},
-			   {click,true}, {doubleclick,true}]),
-
-    set_dir(Opts#opts.dir, Opts),
-
-    case Opts#opts.type of
-	multiselect ->
-	    gs:button(select, btnframe, [{label,{text,"Select"}},
-					 {font,Font},
-					 {pack_x,2}, {pack_y,2}]),
-	    gs:button(all, btnframe, [{label,{text,"All"}}, {font,Font},
-				      {pack_x,4}, {pack_y,2}]),
-	    gs:button(close,btnframe,[{label,{text,"Done"}},
-				      {font,Font},
-				      {pack_x,6}, {pack_y,2}]);
-	Type ->
-	    Text = case Type of
-		       open -> "Open";
-		       save -> "Save"
-		   end,
-	    gs:button(select, btnframe, [{label,{text,Text}},
-					 {font,Font},
-					 {pack_x,2}, {pack_y,2}]),
-	    gs:button(cancel, btnframe, [{label,{text,"Cancel"}},
-					 {font,Font},
-					 {pack_x,6}, {pack_y,2}])
+    Font = {font, case gs:read(GS, {choose_font, {screen, [], 12}}) of
+		      Font0 when element(1, Font0) =:= screen -> Font0;
+		      _ -> gs:read(GS, {choose_font, {courier, [], 12}})
+		  end},
+    gs:window(win, GS, [{title, if
+				    Type =:= open -> "Open File";
+				    Type =:= save -> "Save File";
+				    Type =:= multiselect -> "Select Files"
+				end},
+			{width, ?WIDTH}, {height, ?HEIGHT},
+			{configure, true}]),
+    gs:frame(btnframe, resizer, [{packer_x, [{stretch, 1},
+					     {fixed, ?BTNW},
+					     {stretch, 1},
+					     {fixed, ?BTNW},
+					     {stretch, 1},
+					     {fixed, ?BTNW},
+					     {stretch, 1}]},
+				 {packer_y, [{stretch, 1}, {fixed, ?BTNH}, {stretch, 1}]},
+				 {pack_x, 2}, {pack_y, 3}]),
+    gs:frame(frame,
+	     gs:frame(resizer, win, [{packer_x, [?MARG, {stretch, 1}, ?MARG]},
+				     {packer_y, [?MARG, {stretch, 10}, {stretch, 1, 2 * ?BTNH}, ?MARG]}]),
+	     [{packer_x, [{fixed, ?UPW}, {stretch, 1}]}, {packer_y, [{fixed, ?UPH}, {fixed, ?ENTRYH}, {stretch, 1}]},
+	      {pack_x, 2}, {pack_y, 2}]),
+    gs:button(up, frame, [{label, {image, filename:join([code:priv_dir(gs), "bitmap", "fup.bm"])}},
+			  {pack_x, 1},
+			  {pack_y, 1}]),
+    gs:label(infodir, frame, [{label, {text, " Dir:"}}, Font, {pack_x, 2}, {pack_y, 1}, {align, w}]),
+    gs:label(l1, frame, [{label, {text, "File:"}}, Font, {align, e}, {pack_x, 1}, {pack_y, 2}]),
+    gs:entry(entry, frame, [Font, {keypress, true}, {pack_x, 2}, {pack_y, 2}]),
+    gs:listbox(lb, frame, [Font,
+			   {pack_x, {1, 2}}, {pack_y, 3},
+			   {selectmode, single},
+			   {vscroll, right},
+			   {click, true}, {doubleclick, true}]),
+    set_dir(Dir, Opts),
+    if
+	Type =:= multiselect -> lists:foldl(fun({T, N}, A) ->
+						gs:button(T, btnframe,
+							  [{label, {text, N}}, Font, {pack_x, A}, {pack_y, 2}]),
+						A + 2
+					    end, 2, [{select, "Select"}, {all, "All"}, {close, "Done"}]);
+	true ->
+	    gs:button(select, btnframe,
+		      [{label, {text, if
+					  Type =:= open -> "Open";
+					  Type =:= save -> "Save"
+				      end}},
+		       Font,
+		       {pack_x, 2}, {pack_y, 2}]),
+	    gs:button(cancel, btnframe, [{label, {text, "Cancel"}}, Font, {pack_x, 6}, {pack_y, 2}])
     end,
-
-    gs:config(resizer, [{width,?WIDTH}, {height,?HEIGHT}]),
-    gs:config(win, {map,true}).
+    gs:config(resizer, [{width, ?WIDTH}, {height, ?HEIGHT}]),
+    gs:config(win, {map, true}).
 
 %% update(AbsFile, Opts) -> Opts'
-update(AbsFile, Opts) ->
+update(AbsFile, #opts{hidden = Hidden} = Opts) ->
     Dir = filename:dirname(AbsFile),
     File = filename:basename(AbsFile),
-
     %% Hide the file
-    Hidden0 = Opts#opts.hidden,
-    Hidden = case lists:keysearch(Dir, 1, Hidden0) of
-		 {value, {_Dir, Files}} ->
-		     lists:keyreplace(Dir, 1, Hidden0,
-				      {Dir, [File|Files]});
-		 false ->
-		     [{Dir, [File]} | Hidden0]
-	     end,
-    Opts2 = Opts#opts{hidden=Hidden},
-    set_dir(Dir, Opts2).
+    set_dir(Dir, Opts#opts{hidden = case lists:keyfind(Dir, 1, Hidden) of
+					{_Dir, Files} -> lists:keyreplace(Dir, 1, Hidden, {Dir, [File|Files]});
+					false -> [{Dir, [File]}|Hidden]
+				    end}).
 
 %% select_all() -> {Dirs, Files}
-select_all() ->
-    Is = lists:seq(0, gs:read(lb, size)-1),
-    sort_selected(Is, [], []).
+select_all() -> sort_selected(lists:seq(0, gs:read(lb, size) - 1), [], []).
 
 sort_selected([I|Is], Dirs, Files) ->
-    FileOrDir = gs:read(lb, {get,I}),
+    FileOrDir = gs:read(lb, {get, I}),
     case lists:last(FileOrDir) of
-	$/ ->
-	    sort_selected(Is, [drop_last(FileOrDir)|Dirs], Files);
-	_Ch ->
-	    sort_selected(Is, Dirs, [FileOrDir|Files])
+	$/ -> sort_selected(Is, [lists:droplast(FileOrDir)|Dirs], Files);
+	_Ch -> sort_selected(Is, Dirs, [FileOrDir|Files])
     end;
-sort_selected([], Dirs, Files) ->
-    {Dirs, Files}.
-
-drop_last(Str) ->
-    lists:sublist(Str, length(Str)-1).
+sort_selected([], Dirs, Files) -> {Dirs, Files}.
 
 %% set_dir(Dir0, Opts) -> Opts'
 %%   Dir0 = up | string() absolute path only
-set_dir(Dir0, Opts) ->
-    Dir = if
-	      Dir0==up -> filename:dirname(Opts#opts.dir);
-	      true ->Dir0
-	  end,
-
+set_dir(up, #opts{dir = Dir} = Opts) -> set_dir(filename:dirname(Dir), Opts);
+set_dir(Dir, Opts) ->
     case filelib:is_dir(Dir) of
 	true ->
-	    gs:config(frame, {cursor,busy}),
+	    gs:config(frame, {cursor, busy}),
 	    gs:config(lb, clear),
-	    Items = get_files(Dir, Opts#opts.hidden,
-			      Opts#opts.extensions),
-	    case Opts#opts.type of
-		save ->
-		    gs:config(entry, {text,Opts#opts.file});
-		_ ->
-		    gs:config(entry, {text,""})
-	    end,
-	    gs:config(lb, [{items,Items}]),
+	    gs:config(entry, {text, if
+					Opts#opts.type =:= save -> Opts#opts.file;
+					true -> ""
+				    end}),
+	    gs:config(lb, [{items, get_files(Dir, Opts#opts.hidden, Opts#opts.extensions)}]),
 	    gs:config(lb, {selection, clear}),
-	    gs:config(infodir, {label,{text,["Dir: "|Dir]}}),
-	    gs:config(frame, {cursor,parent}),
-	    Opts#opts{dir=Dir};
+	    gs:config(infodir, {label, {text, ["Dir: "|Dir]}}),
+	    gs:config(frame, {cursor, parent}),
+	    Opts#opts{dir = Dir};
 	false ->
 	    gs:config(select, beep),
 	    Opts
     end.
 
 get_files(Dir, Hidden, Exts) ->
-    {ok, Items0} = file:list_dir(Dir),
-    
-    Items = case lists:keysearch(Dir, 1, Hidden) of
-		{value, {_Dir, HiddenHere}} ->
-		    lists:filter(fun(Item0) ->
-					 not lists:member(Item0,
-							  HiddenHere)
-				 end,
-				 Items0);
-		false ->
-		    Items0
-	    end,
-
-    get_files(Dir, Items, [], [], Exts).
+    {ok, Items} = file:list_dir(Dir),
+    get_files(Dir,
+	      case lists:keyfind(Dir, 1, Hidden) of
+		  {_Dir, HiddenHere} -> lists:filter(fun(Item) -> not lists:member(Item, HiddenHere) end, Items);
+		  false -> Items
+	      end,
+	      [], [], Exts).
 
 get_files(Dir, [Item0|Items], Dirs, Files, Exts) ->
     Item = filename:join(Dir, Item0),
     case filelib:is_dir(Item) of
-	true ->
-	    get_files(Dir, Items, [Item0++"/"|Dirs], Files, Exts);
-	false ->
-	    case filelib:is_regular(Item) of
-		true when Exts==[] ->
-		    get_files(Dir, Items, Dirs, [Item0|Files], Exts);
-		true ->
-		    case lists:member(filename:extension(Item), Exts) of
-			true ->
-			    get_files(Dir,Items,Dirs,[Item0|Files],Exts);
-			false ->
-			    get_files(Dir, Items, Dirs, Files, Exts)
-		    end;
-		false ->
-		    get_files(Dir, Items, Dirs, Files, Exts)
-	    end
+	true -> get_files(Dir, Items, [Item0 ++ "/"|Dirs], Files, Exts);
+	false -> get_files(Dir, Items, Dirs,
+			   case filelib:is_regular(Item) andalso
+				(Exts =:= [] orelse lists:member(filename:extension(Item), Exts)) of
+			       true -> [Item0|Files];
+			       false -> Files
+			   end,
+			   Exts)
     end;
-get_files(_Dir, [], Dirs, Files, _Exts) ->
-    lists:sort(Dirs) ++ lists:sort(Files).
+get_files(_Dir, [], Dirs, Files, _Exts) -> lists:sort(Dirs) ++ lists:sort(Files).
diff -Ndurp otp_src_19.0.5/lib/gs/src/tool_utils.erl otp_src_19.0.5-lib-gs/lib/gs/src/tool_utils.erl
--- otp_src_19.0.5/lib/gs/src/tool_utils.erl	2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/tool_utils.erl	2016-08-25 16:37:44.567693306 +0300
@@ -20,10 +20,11 @@
 
 %%
 -module(tool_utils).
--compile([{nowarn_deprecated_function,{gs,config,2}},
-          {nowarn_deprecated_function,{gs,create,3}},
-          {nowarn_deprecated_function,{gs,destroy,1}},
-          {nowarn_deprecated_function,{gs,read,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, config, 2}},
+          {nowarn_deprecated_function, {gs, create, 3}},
+          {nowarn_deprecated_function, {gs, destroy, 1}},
+          {nowarn_deprecated_function, {gs, read, 2}}]).
 
 -include_lib("kernel/include/file.hrl").
 
@@ -61,117 +62,63 @@
 %%   requires that the path Netscape.exe must be in TBD.
 %%   (TEMPORARY solution..., can be done better)
 %%----------------------------------------------------------------------
-open_help(Parent, nofile) ->
-    notify(Parent, "Sorry, no help information exists");
+open_help(Parent, nofile) -> notify(Parent, "Sorry, no help information exists");
 open_help(Parent, File) ->
     case application:get_env(kernel, browser_cmd) of
-	undefined ->
-	    open_help_default(Parent, File);
-	{ok, Cmd} when is_list(Cmd) ->
-	    spawn(os, cmd, [Cmd ++ " " ++ File]);
-	{ok, {M, F, A}} ->
-	    apply(M, F, [File|A]);
-	_Other ->
-	    Str = ["Bad Kernel configuration parameter browser_cmd",
-		   "Do not know how to display help file"],
-	    notify(Parent, Str)
+	undefined -> open_help_default(Parent, File);
+	{ok, Cmd} when is_list(Cmd) -> spawn(os, cmd, [Cmd ++ " " ++ File]);
+	{ok, {M, F, A}} -> apply(M, F, [File|A]);
+	_Other -> notify(Parent,
+	                 ["Bad Kernel configuration parameter browser_cmd", "Do not know how to display help file"])
     end.
 
 open_help_default(Parent, File) ->
-    Cmd = case file_type(File) of
-
-	      %% Local file
-	      local ->
-		  case os:type() of
-		      {unix,Type} ->
-                          case Type of
-                               darwin -> "open " ++ File;
-                               _Else -> "netscape -remote \"openURL(file:" ++ File ++ ")\""
-			  end;
-		      {win32,_AnyType} ->
-			  "start " ++ filename:nativename(File);
-
-		      _Other ->
-			  unknown
-		  end;
-
-	      %% URL
-	      remote ->
-		  case os:type() of
-		      {unix,Type} ->
-                          case Type of
-                               darwin -> "open " ++ File;
-                               _Else -> "netscape -remote \"openURL(file:" ++ File ++ ")\""
+    case os:type() of
+	{win32, _Type} -> case file_type(File) of
+			      {error, Reason} -> notify(Parent, [File, file:format_error(Reason)]);
+			      T -> spawn(os, cmd,
+					 ["start " ++ if
+							  T =:= local -> filename:nativename(File);
+							  T =:= remote -> re:replace(File, "\\\\", "/",
+										     [global, {return, list}])
+						      end])
 			  end;
-		      {win32,_AnyType} ->
-			  "netscape.exe -h " ++
-			      re:replace(File,"\\\\","/",[global,{return,list}]);
-		      _Other ->
-			  unknown
-		  end;
-
-	      Error -> % {error,Reason}
-		  Error
-	  end,
-
-    if
-	is_list(Cmd) ->
-	    spawn(os, cmd, [Cmd]);
-	Cmd==unknown ->
-	    Str = ["Sorry, do not know how to",
-		   "display HTML files at this platform"],
-	    notify(Parent, Str);
-	true ->
-	    {error, Reason} = Cmd,
-	    Str = file:format_error(Reason),
-	    notify(Parent, [File,Str])
+	{unix, Type} -> spawn(os, cmd, if
+					   Type =:= darwin -> ["open " ++ File];
+					   true -> ["xdg-open \"" ++ File ++ "\""]
+				       end);
+	_Other -> notify(Parent, ["Sorry, do not know how to", "display HTML files at this platform"])
     end.
 
-%% file_type(File) -> local | remote | {error,Reason}
+%% file_type(File) -> local | remote | {error, Reason}
 %%   File = string()
 %%   Reason - see file(3)
 %% Returns local if File is an existing, readable file
 %% Returns remote if File is a remote URL (ie begins with 'http:')
+file_type("http://" ++ _URL) -> remote;
 file_type(File) ->
-    case File of
-	"http://"++_URL ->
-	    remote;
-	_ ->
-	    %% HTML files can have a tag (<name>.html#tag), this must be
-	    %% removed when checking if the file exists
-	    File2 = case filename:extension(File) of
-			".html#"++_Index ->
-			    filename:rootname(File)++".html";
-			_ ->
-			    File
-		    end,
-
-            case file:read_file_info(File2) of
-	        {ok, FileInfo} when FileInfo#file_info.type==regular,
-				    FileInfo#file_info.access/=none ->
-		    local;
-		{ok, FileInfo} when FileInfo#file_info.type/=regular ->
-		    {error,einval};
-		{ok, FileInfo} when FileInfo#file_info.access==none ->
-		    {error,eacces};
-		Error ->
-		    Error
-	    end
+    %% HTML files can have a tag (<name>.html#tag), this must be
+    %% removed when checking if the file exists
+    case file:read_file_info(case filename:extension(File) of
+                                 ".html#" ++ _Index -> filename:rootname(File) ++ ".html";
+                                 _ -> File
+                             end) of
+	{ok, #file_info{type = regular, access = Access}} when Access =/= none -> local;
+	{ok, #file_info{type = Type}} when Type =/= regular -> {error, einval};
+	{ok, #file_info{access = none}} -> {error, eacces};
+	Error -> Error
     end.
 
-
 %%----------------------------------------------------------------------
 %% file_dialog(Options) -> tbd
 %%----------------------------------------------------------------------
-file_dialog(Options) ->
-    tool_file_dialog:start(Options).
-
+file_dialog(Options) -> tool_file_dialog:start(Options).
 
 %%----------------------------------------------------------------------
 %% notify(Parent, Strings) -> ok
 %% confirm(Parent, Strings) -> ok | cancel
 %% confirm_yesno(Parent, Strings) -> yes | no | cancel
-%% request(Parent, Strings) -> {ok,string()} | cancel
+%% request(Parent, Strings) -> {ok, string()} | cancel
 %%   Parent = gsobj()  (GS root object or parent window)
 %%   Strings = string() | [string()]
 %% Opens a window with the specified message (Strings) and locks the GUI
@@ -189,120 +136,92 @@ file_dialog(Options) ->
 -define(Hent, 30).
 -define(Wbtn, 50).
 -define(Hbtn, 30).
--define(PAD,  10).
+-define(PAD, 10).
 
-notify(Parent, Strings) ->
-     help_win(notify, Parent, Strings).
-confirm(Parent, Strings) ->
-    help_win(confirm, Parent, Strings).
-confirm_yesno(Parent, Strings) ->
-    help_win(confirm_yesno, Parent, Strings).
-request(Parent, Strings) ->
-    help_win(request, Parent, Strings).
+notify(Parent, Strings) -> help_win(Parent, Strings, notify).
+confirm(Parent, Strings) -> help_win(Parent, Strings, confirm).
+confirm_yesno(Parent, Strings) -> help_win(Parent, Strings, confirm_yesno).
+request(Parent, Strings) -> help_win(Parent, Strings, request).
 
-help_win(Type, Parent, Strings) ->
-    GenOpts = [{keypress,true}],
-    GenOpts2 = [{font,{screen,12}} | GenOpts],
+-define(GenOpts, [{keypress, true}]).
+-define(GenOpts2, [{font, {screen, 12}}|?GenOpts]).
+
+help_win(Parent, Strings, Type) ->
     Buttons = buttons(Type),
     Nbtn = length(Buttons),
-
     %% Create the window and its contents
-    Win = gs:create(window, Parent, [{title,title(Type)} | GenOpts]),
-    Top = gs:create(frame, Win, GenOpts),
-    Lbl = gs:create(label, Top, [{align,c}, {justify,center}|GenOpts2]),
-    Mid = if
-	      Type==request -> gs:create(frame, Win, GenOpts);
-	      true -> ignore
-	  end,
-    Ent = if
-	      Type==request ->
-		  Events = [{setfocus,true},
-			    {focus,true},{enter,true},{leave,true}],
-		  gs:create(entry, Mid, GenOpts2++Events);
-	      true -> ignore
-	  end,
-    Bot = gs:create(frame, Win, GenOpts),
-
+    Win = gs:create(window, Parent, [{title, title(Type)}|?GenOpts]),
+    Top = gs:create(frame, Win, ?GenOpts),
+    Lbl = gs:create(label, Top, [{align, c}, {justify, center}|?GenOpts2]),
+    Bot = gs:create(frame, Win, ?GenOpts),
     %% Find out minimum size required for label, entry and buttons
-    Font = gs:read(Parent, {choose_font, {screen,12}}),
+    Font = gs:read(Parent, {choose_font, {screen, 12}}),
     Text = insert_newlines(Strings),
-    {Wlbl0,Hlbl0} = gs:read(Lbl, {font_wh,{Font,Text}}),
-    {_Went0,Hent0} = gs:read(Lbl, {font_wh,{Font,"Entry"}}),
-    {Wbtn0,Hbtn0} = gs:read(Lbl, {font_wh,{Font,"Cancel"}}),
-    
+    [{Wlbl0, Hlbl0}, {_Went0, Hent0}, {Wbtn0, Hbtn0}] = lists:map(fun(E) -> gs:read(Lbl, {font_wh, {Font, E}}) end,
+								  [Text, "Entry", "Cancel"]),
     %% Compute size of the objects and adjust the graphics accordingly
-    Wbtn = erlang:max(Wbtn0+10, ?Wbtn),
-    Hbtn = erlang:max(Hbtn0+10, ?Hbtn),
-    Hent = erlang:max(Hent0+10, ?Hent),
-    Wlbl = erlang:max(Wlbl0, erlang:max(Nbtn*Wbtn+(Nbtn-1)*?PAD, ?Wlbl)),
-    Hlbl = erlang:max(Hlbl0, ?Hlbl),
-
-    Wwin = ?PAD+Wlbl+?PAD,
-
-    Htop = ?PAD+Hlbl,
-    Hmid = if Type==request -> ?PAD+Hent; true -> 0 end,
-    Hbot = ?PAD+Hbtn+?PAD,
-    Hwin = Htop+Hmid+Hbot,
-
-    case catch get_coords(Parent, Wwin, Hwin) of
-	{Xw, Yw} when is_integer(Xw), is_integer(Yw) ->
-	    gs:config(Win, [{x,Xw}, {y,Yw}]);
-	_ ->
-	    ignore
+    Wbtn = max(Wbtn0 + 10, ?Wbtn),
+    Hbtn = max(Hbtn0 + 10, ?Hbtn),
+    Hent = max(Hent0 + 10, ?Hent),
+    Wlbl = max(Wlbl0, max(Nbtn * Wbtn + Nbtn * ?PAD - ?PAD, ?Wlbl)),
+    Hlbl = max(Hlbl0, ?Hlbl),
+    Wwin = Wlbl + (?PAD + ?PAD),
+    Htop = Hlbl + ?PAD,
+    {Mid, Ent, Hmid, State} = if
+				  Type =:= request ->
+				      M = gs:create(frame, Win, ?GenOpts),
+				      {M,
+				       gs:create(entry, M, ?GenOpts2 ++ [{setfocus, true}, {focus, true},
+									 {enter, true}, {leave, true}]),
+				       Hent + ?PAD,
+				       #state{in_focus = 1, is_cursor = false}};
+			   true -> {ignore, ignore, 0, #state{}}
+		       end,
+    Hbot = Hbtn + (?PAD + ?PAD),
+    Hwin = Htop + Hmid + Hbot,
+    try get_coords(Parent, Wwin, Hwin) of
+	{Xw, Yw} when is_integer(Xw), is_integer(Yw) -> gs:config(Win, [{x, Xw}, {y, Yw}])
+	catch _:_ -> ignore
     end,
-	    
-    gs:config(Win, [                       {width,Wwin},{height,Hwin}]),
-
-    gs:config(Top, [{x,0},   {y,0},        {width,Wwin},{height,Htop}]),
-    gs:config(Lbl, [{x,?PAD},{y,?PAD},     {width,Wlbl},{height,Hlbl}]),
-
-    gs:config(Mid, [{x,0},   {y,Htop},     {width,Wwin},{height,Hmid}]),
-    gs:config(Ent, [{x,?PAD},{y,?PAD},     {width,Wlbl},{height,Hent}]),
-
-    gs:config(Bot, [{x,0},   {y,Htop+Hmid},{width,Wwin},{height,Hbot}]),
-
+    Ww = {width, Wwin},
+    Wl = {width, Wlbl},
+    gs:config(Win, [Ww, {height, Hwin}]),
+    gs:config(Top, [{x, 0}, {y, 0}, Ww, {height, Htop}]),
+    gs:config(Lbl, [{x, ?PAD}, {y, ?PAD}, Wl, {height, Hlbl}]),
+    gs:config(Mid, [{x, 0}, {y, Htop}, Ww, {height, Hmid}]),
+    gs:config(Ent, [{x, ?PAD}, {y, ?PAD}, Wl, {height, Hent}]),
+    gs:config(Bot, [{x, 0}, {y, Htop + Hmid}, Ww, {height, Hbot}]),
     %% Insert the label text
-    gs:config(Lbl, {label,{text,Text}}),
-
+    gs:config(Lbl, {label, {text, Text}}),
     %% Add the buttons
-    Xbtns = xbuttons(Buttons, Wbtn, Wwin, Wlbl),
-    BtnObjs =
-	lists:map(fun({Btext,BX}) ->
-			  gs:create(button, Bot, [{x,BX-1}, {y,?PAD-1},
-						  {width,Wbtn+2},
-						  {height,Hbtn+2},
-						  {label,{text,Btext}},
-						  {data,data(Btext)}
-						  | GenOpts2])
-		  end,
-		  Xbtns),
-    Highlighted = highlight(undef, 1, BtnObjs),
-
-    gs:config(Win, [{map,true}]),
-
-    State = if
-		Type==request ->
-		    #state{in_focus=1, is_cursor=false};
-		true ->
-		    #state{}
-	    end,
-    event_loop(State#state{type=Type, win=Win, entry=Ent,
-			   buttons=BtnObjs, highlighted=Highlighted}).
+    BtnObjs = lists:map(fun({Btext, BX}) ->
+			    gs:create(button, Bot, [{x, BX - 1}, {y, ?PAD - 1},
+						    {width, Wbtn + 2}, {height, Hbtn + 2},
+						    {label, {text, Btext}},
+						    {data, data(Btext)}
+						    |?GenOpts2])
+			end, xbuttons(Buttons, Wbtn, Wwin, Wlbl)),
+    gs:config(Win, [{map, true}]),
+    event_loop(State#state{type = Type,
+			   win = Win,
+			   entry = Ent,
+			   buttons = BtnObjs,
+			   highlighted = highlight(undef, 1, BtnObjs)}).
 
-title(notify) ->        "Notification";
-title(confirm) ->       "Confirmation";
+title(notify) -> "Notification";
+title(confirm) -> "Confirmation";
 title(confirm_yesno) -> "Confirmation";
-title(request) ->       "Request".
+title(request) -> "Request".
 
-buttons(notify) ->        ["Ok"];
-buttons(confirm) ->       ["Ok", "Cancel"];
+buttons(notify) -> ["Ok"];
+buttons(confirm) -> ["Ok", "Cancel"];
 buttons(confirm_yesno) -> ["Yes", "No", "Cancel"];
-buttons(request) ->       ["Ok", "Cancel"].
+buttons(request) -> ["Ok", "Cancel"].
 
-data("Ok") ->     {helpwin,ok};
-data("Yes") ->    {helpwin,yes};
-data("No") ->     {helpwin,no};
-data("Cancel") -> {helpwin,cancel}.
+data("Ok") -> {helpwin, ok};
+data("Yes") -> {helpwin, yes};
+data("No") -> {helpwin, no};
+data("Cancel") -> {helpwin, cancel}.
 
 get_coords(Parent, W, H) ->
     case gs:read(Parent, x) of
@@ -312,9 +231,7 @@ get_coords(Parent, W, H) ->
 		    case gs:read(Parent, width) of
 			W0 when is_integer(W0) ->
 			    case gs:read(Parent, height) of
-				H0 when is_integer(H0) ->
-				    {round((X+W0/2)-W/2),
-				     round((Y+H0/2)-H/2)};
+				H0 when is_integer(H0) -> {round((X + W0 / 2) - W / 2), round((Y + H0 / 2) - H / 2)};
 				_ -> error
 			    end;
 			_ -> error
@@ -324,115 +241,87 @@ get_coords(Parent, W, H) ->
 	_ -> error
     end.
 
-xbuttons([B], Wbtn, Wwin, _Wlbl) ->
-    [{B, round(Wwin/2-Wbtn/2)}];
-xbuttons([B1,B2], Wbtn, Wwin, Wlbl) ->
-    Margin = (Wwin-Wlbl)/2,
-    [{B1,round(Margin)}, {B2,round(Wwin-Margin-Wbtn)}];
-xbuttons([B1,B2,B3], Wbtn, Wwin, Wlbl) ->
-    Margin = (Wwin-Wlbl)/2,
-    [{B1,round(Margin)},
-     {B2,round(Wwin/2-Wbtn/2)},
-     {B3,round(Wwin-Margin-Wbtn)}].
+xbuttons([B], Wbtn, Wwin, _Wlbl) -> [xbutton(B, Wbtn, Wwin)];
+xbuttons([B1, B2], Wbtn, Wwin, Wlbl) ->
+    Margin = margin(Wwin, Wlbl),
+    [xbutton(B1, Margin), xbutton(B2, Wbtn, Wwin, Margin)];
+xbuttons([B1, B2, B3], Wbtn, Wwin, Wlbl) ->
+    Margin = margin(Wwin, Wlbl),
+    [xbutton(B1, Margin), xbutton(B2, Wbtn, Wwin), xbutton(B3, Wbtn, Wwin, Margin)].
 
-highlight(Prev, New, BtnObjs) when New>0, New=<length(BtnObjs) ->
-    if
-	Prev==undef -> ignore;
-	true ->
-	    gs:config(lists:nth(Prev, BtnObjs), [{highlightbw,0}])
-    end,
-    gs:config(lists:nth(New, BtnObjs), [{highlightbw,1},
-					{highlightbg,black}]),
+xbutton(B, Margin) -> {B, round(Margin)}.
+
+xbutton(B, Wbtn, Wwin) -> {B, round(Wwin / 2 - Wbtn / 2)}.
+
+xbutton(B, Wbtn, Wwin, Margin) -> {B, round(Wwin - Margin - Wbtn)}.
+
+margin(Wwin, Wlbl) -> (Wwin - Wlbl) / 2.
+
+highlight(Prev, New, BtnObjs) when New > 0, New =< length(BtnObjs) ->
+    Prev =:= undef orelse gs:config(lists:nth(Prev, BtnObjs), [{highlightbw, 0}]),
+    gs:config(lists:nth(New, BtnObjs), [{highlightbw, 1}, {highlightbg, black}]),
     New;
-highlight(Prev, _New, _BtnObjs) -> % New is outside allowed range
-    Prev.
+highlight(Prev, _New, _BtnObjs) -> Prev. % New is outside allowed range
 
 event_loop(State) ->
     receive
-	GsEvent when element(1, GsEvent)==gs ->
-	    case handle_event(GsEvent, State) of
-		{continue, NewState} ->
-		    event_loop(NewState);
-
-		{return, Result} ->
-		    gs:destroy(State#state.win),
-		    Result
-	    end
+	GsEvent when element(1, GsEvent) =:= gs -> case handle_event(GsEvent, State) of
+						       {continue, NewState} -> event_loop(NewState);
+						       {return, Result} ->
+							   gs:destroy(State#state.win),
+							   Result
+						   end
     end.
 
-handle_event({gs,_,click,{helpwin,Result},_}, State) ->
-    if
-	State#state.type/=request; Result==cancel ->
-	    {return, Result};
-
-	State#state.type==request, Result==ok ->
-	    case gs:read(State#state.entry, text) of
-		"" ->
-		    {continue, State};
-		Info ->
-		    {return, {ok, Info}}
-	    end
+handle_event({gs, _, click, {helpwin, ok}, _}, #state{entry = Ent, type = request} = State) ->
+    case gs:read(Ent, text) of
+	"" -> {continue, State};
+	Info -> {return, {ok, Info}}
     end;
+handle_event({gs, _, click, {helpwin, cansel}, _}, _State) -> {return, cancel};
 
 %% When the entry (Type==request) is in focus and the mouse pointer is
 %% over it, don't let 'Left'|'Right' keypresses affect which button is
 %% selected
-handle_event({gs,Ent,enter,_,_}, #state{entry=Ent}=State) ->
-    {continue, State#state{is_cursor=true}};
-handle_event({gs,Ent,leave,_,_}, #state{entry=Ent}=State) ->
-    {continue, State#state{is_cursor=false}};
-handle_event({gs,Ent,focus,_,[Int|_]}, #state{entry=Ent}=State) ->
-    {continue, State#state{in_focus=Int}};
+handle_event({gs, Ent, enter, _, _}, #state{entry = Ent} = State) -> {continue, State#state{is_cursor = true}};
+handle_event({gs, Ent, leave, _, _}, #state{entry = Ent} = State) -> {continue, State#state{is_cursor = false}};
+handle_event({gs, Ent, focus, _, [Int|_]}, #state{entry = Ent} =State) -> {continue, State#state{in_focus = Int}};
 
-handle_event({gs,Win,keypress,_,['Right'|_]}, #state{win=Win}=State) ->
-    if
-	State#state.type==request,
-	State#state.in_focus==1, State#state.is_cursor==true ->
-	    {continue, State};
-	true ->
-	    Prev = State#state.highlighted,
-	    New = highlight(Prev, Prev+1, State#state.buttons),
-	    {continue, State#state{highlighted=New}}
-    end;
-handle_event({gs,Win,keypress,_,['Left'|_]}, #state{win=Win}=State) ->
-    if
-	State#state.type==request,
-	State#state.in_focus==1, State#state.is_cursor==true ->
-	    {continue, State};
-	true ->
-	    Prev = State#state.highlighted,
-	    New = highlight(Prev, Prev-1, State#state.buttons),
-	    {continue, State#state{highlighted=New}}
-    end;
+handle_event({gs, Win, keypress, _, [Key|_]}, #state{win = Win} = State) when Key =:= 'Right'; Key =:= 'Left' ->
+    {continue,
+     case State of
+	 #state{type = request, in_focus = 1, is_cursor = true} -> State;
+	 #state{highlighted = Prev, buttons = Buttons} ->
+	     State#state{highlighted = highlight(Prev,
+						 Prev + if
+							    Key =:= 'Right' -> +1;
+							    true -> -1
+							end,
+						 Buttons)}
+     end};
 
-handle_event({gs,Ent,keypress,_,['Tab'|_]}, #state{entry=Ent}=State) ->
-    gs:config(hd(State#state.buttons), {setfocus,true}),
-    gs:config(Ent, {select,clear}),
-    {continue, State#state{in_focus=0}};
+handle_event({gs, Ent, keypress, _, ['Tab'|_]}, #state{entry = Ent, buttons = [Button|_]} = State) ->
+    gs:config(Button, {setfocus, true}),
+    gs:config(Ent, {select, clear}),
+    {continue, State#state{in_focus = 0}};
 
-handle_event({gs,Win,keypress,_,['Return'|_]}, #state{win=Win}=State) ->
-    Selected = lists:nth(State#state.highlighted, State#state.buttons),
-    Data = gs:read(Selected, data),
-    handle_event({gs,Win,click,Data,undef}, State);
+handle_event({gs, Win, keypress, _, ['Return'|_]},
+             #state{win = Win, highlighted = Highlighted, buttons = Buttons} = State) ->
+    handle_event({gs, Win, click, gs:read(lists:nth(Highlighted, Buttons), data), undef}, State);
 
-handle_event({gs,Win,destroy,_,_}, #state{win=Win}=State) ->
-    if
-	State#state.type==notify -> {return, ok};
-	true -> {return, cancel}
-    end;
+handle_event({gs, Win, destroy, _, _}, #state{win = Win, type = Type}) ->
+    {return, if
+		  Type =:= notify -> ok;
+		  true -> cancel
+	     end};
 
 %% Flush any other GS events
-handle_event({gs,_Obj,_Event,_Data,_Arg}, State) ->
-    {continue, State}.
+handle_event({gs, _Obj, _Event, _Data, _Arg}, State) -> {continue, State}.
 
 %% insert_newlines(Strings) => string()
 %%   Strings - string() | [string()]
 %% If Strings is a list of strings, return a string where all these
-%% strings are concatenated with newlines in between,otherwise return
+%% strings are concatenated with newlines in between, otherwise return
 %% Strings.
-insert_newlines([String|Rest]) when is_list(String),Rest/=[]->
-    String ++ "\n" ++ insert_newlines(Rest);
-insert_newlines([Last]) ->
-    [Last];
-insert_newlines(Other) ->
-    Other.
+insert_newlines([String|Rest]) when is_list(String), Rest =/= [] -> String ++ "\n" ++ insert_newlines(Rest);
+insert_newlines(Other) -> Other.
openSUSE Build Service is sponsored by