diff git a/apps/graphs/source/assembly.lisp b/apps/graphs/source/assembly.lisp
new file mode 100644
index 0000000000000000000000000000000000000000..6bd7e4b541a37e24068f9ebcce8f41321abb4389
 /dev/null
+++ b/apps/graphs/source/assembly.lisp
@@ 0,0 +1,73 @@
+(inpackage :graphplot)
+
+(defineobject assembly (baseobject)
+
+ :inputslots
+ ((gridincrement 1)
+ (function #'identity) (rangemin 5) (rangemax 5) (increment 0.1)
+ (showaxes? t)
+ (showgrid? (the showaxes?))
+
+ (domainmin (apply #'min (the ysamples)))
+ (domainmax (apply #'max (the ysamples))))
+
+
+ :computedslots
+ ((rangeinterval ( (the rangemax) (the rangemin)))
+
+ (domaininterval ( (the domainmax) (the domainmin)))
+
+ (xsamples (listofnumbers (the rangemin) (the rangemax) (the increment)))
+ (ysamples (mapcar #'(lambda(x) (funcall (the function) x)) (the xsamples)))
+
+ (curvesamplepoints (mapcar #'(lambda(x y) (makepoint x y 0))
+ (the xsamples) (the ysamples))))
+
+
+ :objects
+ (
+ (pointsdisplay :type 'pointsdisplay
+ :hidden? t
+ :points (the curvesamplepoints))
+
+ (curve :type 'fittedcurve
+ :points (the curvesamplepoints))
+
+ (xaxis :type (if (the showaxes?) 'line 'nullobject)
+ :start (makepoint (the rangemin) 0 0)
+ :end (makepoint (the rangemax) 0 0)
+ :displaycontrols (list :color :green :linestyle :dashed))
+
+ (xgrid :type (if (the showgrid?) 'line 'nullobject)
+ :sequence (:size (floor (/ (the domaininterval) (the gridincrement))))
+ :displaycontrols (list :linethickness 0.5 :color :grey)
+ :start (makepoint (1+ (the rangemin))
+ (+ (* (thechild index) (the gridincrement))
+ (floor (the domainmin))
+ (if (evenp (floor (the domainmin))) 0 1)) 0)
+ :end (makepoint (1+ (the rangemax))
+ (+ (* (thechild index) (the gridincrement))
+ (floor (the domainmin))
+ (if (evenp (floor (the domainmin))) 0 1)) 0))
+
+ (yaxis :type (if (the showaxes?) 'line 'nullobject)
+ :start (makepoint 0 (the domainmin) 0)
+ :end (makepoint 0 (the domainmax) 0)
+ :displaycontrols (list :color :red :linestyle :dashed))
+
+ (ygrid :type (if (the showgrid?) 'line 'nullobject)
+ :sequence (:size (floor (/ (the rangeinterval) (the gridincrement))))
+ :displaycontrols (list :linethickness 0.5 :color :grey)
+ :start (makepoint (+ (* (thechild index) (the gridincrement))
+ (floor (the rangemin)) 1)
+ (1 (the domainmin))
+ 0)
+ :end (makepoint (+ (* (thechild index) (the gridincrement))
+ (floor (the rangemin)) 1)
+ (1 (the domainmax))
+ 0))
+
+ ))
+
+
+
diff git a/apps/graphs/source/package.lisp b/apps/graphs/source/package.lisp
new file mode 100644
index 0000000000000000000000000000000000000000..ea245a2eb42f07f76f758cc375aa677ba3ec205b
 /dev/null
+++ b/apps/graphs/source/package.lisp
@@ 0,0 +1 @@
+(gwl:definepackage :graphplot (:export #:ui #:assembly))
diff git a/apps/graphs/source/ui.lisp b/apps/graphs/source/ui.lisp
new file mode 100644
index 0000000000000000000000000000000000000000..04d982c3afcd16ce1468b0dbe6389bb99dc78e56
 /dev/null
+++ b/apps/graphs/source/ui.lisp
@@ 0,0 +1,79 @@
+(inpackage :graphplot)
+
+(setq *developing?* t)
+
+(defineobject ui (baseajaxsheet)
+
+ :computedslots
+ ((useraphael? t)
+ (usex3dom? t)
+
+ (functionspecs (list (list :functionbody
+ (the (functionbodies 0) value)
+ :domainmin 5 :domainmax 5)))
+
+
+ (numberoffunctions 1)
+
+ #+nil
+ (htmlsections (list (the inputssection)
+ (the resultssection)
+ (the viewport)))
+
+ (mainsheetbody
+ (withclwhostring ()
+ (:p (when *developing?* (str (the developmentlinks))))
+ (:p (str (the inputssection maindiv)))
+ (:p (str (the resultssection maindiv)))
+ (:p (str (the viewport maindiv)))))
+
+ (rangemin (apply #'min (mapsend (the graphs) :rangemin)))
+ (rangemax (apply #'max (mapsend (the graphs) :rangemax)))
+
+ (domainmin (apply #'min (mapsend (the graphs) :domainmin)))
+ (domainmax (apply #'max (mapsend (the graphs) :domainmax)))
+ )
+
+
+ :hiddenobjects
+ ((graphs :type 'assembly
+ :sequence (:size (length (the functionspecs)))
+ :pseudoinputs (specs)
+ :specs (nth (thechild index) (the functionspecs))
+ :function (let ((form (getf (thechild specs) :functionbody)))
+ `(lambda (gdluser::x) ,(let ((*package* (findpackage :graphplot))) form)))
+ :parameters (removeplistkey (thechild specs) :functionbody))
+
+
+ (functionbodies :type 'textformcontrol
+ :sequence (:size (the numberoffunctions))
+ :ajaxsubmitonchange? t
+ :domain :passthru
+ :default '(* gdluser::x 2)))
+
+
+ :objects
+ ((inputssection :type 'sheetsection
+ :innerhtml (withclwhostring ()
+ (dolist (function (listelements (the functionbodies)))
+ (htm (str (theobject function htmlstring)) :br))))
+
+ (resultssection :type 'sheetsection
+ :innerhtml (withclwhostring ()
+ (fmt "~s" (the (graphs 0) function))))
+
+ (box :type 'box
+ :width (twice (apply #'max (mapcar #'abs (list (the rangemin) (the rangemax)))))
+ :length (twice (apply #'max (mapcar #'abs (list (the domainmin) (the domainmax))))))
+
+ (viewport :type 'baseajaxgraphicssheet
+ :respondent self
+ :viewdirectiondefault :top
+ :imageformatdefault :raphael
+ :displaylistobjectroots (listelements (the graphs))
+ :displaylistobjects (unless (eql (thechild imageformat) :x3dom)
+ (list (the box)))
+ :length 500
+ :width 500)))
+
+
diff git a/gwl/ajax/source/skeletonuielement.lisp b/gwl/ajax/source/skeletonuielement.lisp
index 36fd393c3cd9ab8d69b7239c561b501ef2149c7c..2429a32a49d99f2e26de1ea6252c3a9e7aa5b27d 100644
 a/gwl/ajax/source/skeletonuielement.lisp
+++ b/gwl/ajax/source/skeletonuielement.lisp
@@ 269,9 +269,8 @@ formcontrols (default of these is also nil) will be respected. Default is nil."
(registerhtmlsection!
(section)

 #+nil
 (when *debug?*
+
+ (progn
(format *traceoutput* "~&Before:~%")
(printvariables self)
(printmessages %htmlsectionrootpaths%))
@@ 282,9 +281,8 @@ formcontrols (default of these is also nil) will be respected. Default is nil."
:test #'equalp)
;;:remember? nil
:warnonnontoplevel? nil)))

 #+nil
 (when *debug?*
+
+ (when t
(format *traceoutput* "~&After:~%")
(printmessages %htmlsectionrootpaths%)))